我一直在寻找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()); }