php – 如何在Zend Framework 2中进行文件上传?

前端之家收集整理的这篇文章主要介绍了php – 如何在Zend Framework 2中进行文件上传?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在寻找ZF2中的文件上传.

我知道很多人会认为这个问题太模糊了,但是创建表单元素的最佳方法是什么呢?

我似乎无法找到从哪里开始.我已经排除了在控制器中处理它,因为这将打破DRY原则.表单对象似乎没有“挂钩”任何代码的位置.对于视图来说,视图助手就是这样,所以在那里做任何事都没有意义.这样就离开了输入过滤器.这似乎也不正确.

我已经转向转接适配器,但代码看起来不是很ZF2.

对不起,这是一个模糊的问题,我希望它落在同情的耳朵上.很难学习一个文档很少的文档,并且复杂的事实是我的zend框架1知识有点薄,进度有点慢.

一旦我有一个好的例子工作,我可能会找到一些地方发布它.

这很简单:
[在您的控制器中]
$request = $this->getRequest();
if($request->isPost()) { 
     $files =  $request->getFiles()->toArray();
     $httpadapter = new \Zend\File\Transfer\Adapter\Http(); 
     $filesize  = new \Zend\Validator\File\Size(array('min' => 1000 )); //1KB  
     $extension = new \Zend\Validator\File\Extension(array('extension' => array('txt')));
     $httpadapter->setValidators(array($filesize,$extension),$files['file']['name']);
     if($httpadapter->isValid()) {
         $httpadapter->setDestination('uploads/');
         if($httpadapter->receive($files['file']['name'])) {
             $newfile = $httpadapter->getFileName(); 
         }
     }
}

更新:
我找到了更好的方法来使用表单验证进行文件验证:
将此类添加到您的模块,例如:Application / Validators / File / Image.PHP

<?PHP
namespace Application\Validators\File;

use Application\Validator\FileValidatorInterface;
use Zend\Validator\File\Extension;
use Zend\File\Transfer\Adapter\Http;
use Zend\Validator\File\FilesSize;
use Zend\Filter\File\Rename;
use Zend\Validator\File\MimeType;
use Zend\Validator\AbstractValidator;

class Image extends AbstractValidator
{  
    const FILE_EXTENSION_ERROR  = 'invalidFileExtention';
    const FILE_NAME_ERROR       = 'invalidFileName'; 
    const FILE_INVALID          = 'invalidFile'; 
    const FALSE_EXTENSION       = 'fileExtensionFalse';
    const NOT_FOUND             = 'fileExtensionNotFound';
    const TOO_BIG               = 'fileFilesSizeTooBig';
    const TOO_SMALL             = 'fileFilesSizeTooSmall';
    const NOT_READABLE          = 'fileFilesSizeNotReadable';


    public $minSize = 64;  //KB
    public $maxSize = 1024; //KB
    public $overwrite = true;
    public $newFileName = null;
    public $uploadPath = './data/';
    public $extensions = array('jpg','png','gif','jpeg');
    public $mimeTypes = array(
                    'image/gif','image/jpg','image/png',);

    protected $messageTemplates = array(   
            self::FILE_EXTENSION_ERROR  => "File extension is not correct",self::FILE_NAME_ERROR       => "File name is not correct",self::FILE_INVALID          => "File is not valid",self::FALSE_EXTENSION       => "File has an incorrect extension",self::NOT_FOUND             => "File is not readable or does not exist",self::TOO_BIG               => "All files in sum should have a maximum size of '%max%' but '%size%' were detected",self::TOO_SMALL             => "All files in sum should have a minimum size of '%min%' but '%size%' were detected",self::NOT_READABLE          => "One or more files can not be read",);

    protected $fileAdapter;

    protected $validators;

    protected $filters;

    public function __construct($options)
    {
        $this->fileAdapter = new Http();  
        parent::__construct($options);
    }

    public function isValid($fileInput)
    {   
        $options = $this->getOptions(); 
        $extensions = $this->extensions;
        $minSize    = $this->minSize; 
        $maxSize    = $this->maxSize; 
        $newFileName = $this->newFileName;
        $uploadPath = $this->uploadPath;
        $overwrite = $this->overwrite;
        if (array_key_exists('extensions',$options)) {
            $extensions = $options['extensions'];
        } 
        if (array_key_exists('minSize',$options)) {
            $minSize = $options['minSize'];
        }  
        if (array_key_exists('maxSize',$options)) {
            $maxSize = $options['maxSize'];
        } 
        if (array_key_exists('newFileName',$options)) {
            $newFileName = $options['newFileName'];
        } 
        if (array_key_exists('uploadPath',$options)) {
            $uploadPath = $options['uploadPath'];
        } 
        if (array_key_exists('overwrite',$options)) {
            $overwrite = $options['overwrite'];
        }    
        $fileName   = $fileInput['name']; 
        $fileSizeOptions = null;
        if ($minSize) {
            $fileSizeOptions['min'] = $minSize*1024 ;
        }
        if ($maxSize) {
            $fileSizeOptions['max'] = $maxSize*1024 ;
        }
        if ($fileSizeOptions) {
            $this->validators[] = new FilesSize($fileSizeOptions); 
        }
        $this->validators[] = new Extension(array('extension' => $extensions));
        if (! preg_match('/^[a-z0-9-_]+[a-z0-9-_\.]+$/i',$fileName)) {
            $this->error(self::FILE_NAME_ERROR);
            return false; 
        }

        $extension = pathinfo($fileName,PATHINFO_EXTENSION); 
        if (! in_array($extension,$extensions)) {
            $this->error(self::FILE_EXTENSION_ERROR);
            return false; 
        }
        if ($newFileName) {
            $destination = $newFileName.".$extension";
            if (! preg_match('/^[a-z0-9-_]+[a-z0-9-_\.]+$/i',$destination)) {
                $this->error(self::FILE_NAME_ERROR);
                return false;  
            }
        } else {
            $destination = $fileName;
        } 
        $renameOptions['target'] = $uploadPath.$destination;
        $renameOptions['overwrite'] = $overwrite;
        $this->filters[] = new Rename($renameOptions); 
        $this->fileAdapter->setFilters($this->filters);
        $this->fileAdapter->setValidators($this->validators); 
        if ($this->fileAdapter->isValid()) { 
            $this->fileAdapter->receive();
            return true;
        } else {   
            $messages = $this->fileAdapter->getMessages(); 
            if ($messages) {
                $this->setMessages($messages);
                foreach ($messages as $key => $value) { 
                    $this->error($key);
                }
            } else {
                $this->error(self::FILE_INVALID);
            }
            return false;
        }
    } 

}

在表单中使用并添加filterInput:

array(
        'name' => 'file','required' => true,'validators' => array(
            array(
                'name' => '\Application\Validators\File\Image','options' => array(
                        'minSize' => '64','maxSize' => '1024','newFileName' => 'newFileName2','uploadPath' => './data/'
                )
            )
        )
    )

在你的控制器中:

$postData = array_merge_recursive((array)$request->getPost(),(array)$request->getFiles());
    $sampleForm->setData($postData);  
    if ($sampleForm->isValid()) { 
        //File will be upload,when isValid returns true;
    } else {
        var_dump($sampleForm->getMessages());
    }

猜你在找的PHP相关文章