我试图限制某些文件类型在zend框架2中上传(只想允许.png和.jpg文件),但我遇到了一些问题。
即使我只在验证器中指定了两个mime类型,它也会上传。这是代码
$file = new File();
$form->setInputFilter($file->getInputFilter());
$captions = $request->getPost()->toArray();
$get_file = $this->params()->fromFiles('file');
$data = array_merge_recursive($this->getRequest()->getPost()->toArray(), $this->getRequest()->getFiles()->toArray());
$form->setData($data);
if ($form->isValid()) {
$size = new Size(array('max' => FileHandler::FILESIZE));
$mime = new MimeType('image/jpg,image/png');
$adapter = (new Http())->setValidators(array($size, $mime), $get_file);
if (!$adapter->isValid()) {
$error_msg = $adapter->getMessages();
$error = array();
foreach ($error_msg as $key => $value) {
$error[] = $value;
}
$form->setMessages(array('file' => $error));
return $this->redirect()->toUrl('/admin/upload-failure');
如您所见,它被设置为验证器以检查大小和mime类型。
有关于此的任何想法吗?
答案 0 :(得分:1)
您通过传递无效的选项格式来实例化MimeType
验证程序错误。它应该是一个带有'mimeType'键的数组。检查可用选项here。
我建议不要尝试使用内联的Http实例验证文件,而是为此作业编写自定义的专用InputFilter类。 Zend Framework 2有一个特殊的Zend\InputFilter\FileInput,它与其他人不同,特别是关于验证流程:FileInput的验证器在过滤器之前运行。它还会自动注入并使用Zend\Validator\File\Upload验证程序,该验证程序还会检查文件,以防止在上传过程中出现错误。
您可以通过创建如下所示的自定义MyFileFilter
类轻松利用所有这些内置功能:
<?php
namespace Application\InputFilter;
use Zend\InputFilter\FileInput;
use Zend\InputFilter\InputFilter;
use Zend\Validator\File\Size;
use Zend\Validator\File\MimeType;
class MyFileFilter extends InputFilter
{
/**
* Constructor
*/
public function __construct($postFile)
{
$size = new Size(['max' => FileHandler::FILESIZE]);
$mime = new MimeType(['mimeType' => 'image/jpg,image/png']);
$input = new FileInput('file');
$input->setValue($postFile);
$input->getValidatorChain()
->attach($size)
->attach($mime);
$this->add($input);
}
}
因此,在您的控制器或服务中,您可以这样做:
$filter = new \Application\InputFilter\MyFileFilter($get_file);
if($filter->isValid()) {
// ...
}
这种方法的另一个好处是你可以重复使用这个MyInputFilter来满足应用程序中的其他上传需求,只需进行一些小的改进。 (参数化mime类型和大小值等。)