Php 检测和验证ZF2中的Mime类型

Php 检测和验证ZF2中的Mime类型,php,validation,zend-framework2,mime-types,Php,Validation,Zend Framework2,Mime Types,我试图限制在zend framework 2中上载某些文件类型(只允许.png和.jpg文件),但在这样做时遇到了一些问题 即使我在验证器中只指定了两种mime类型,它也会上传。这是密码 $file = new File(); $form->setInputFilter($file->getInputFilter()); $captions = $request->getPost()->toArray(); $get_

我试图限制在zend framework 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类型


对此有什么想法吗?

通过传递无效的选项格式,您正在实例化
MimeType
验证器。它应该是一个具有“mimeType”键的数组。检查可用选项

与其尝试使用Http实例内联验证您的文件,我建议为此作业编写一个自定义的专用InputFilter类。Zend Framework 2有一个与其他框架不同的特殊功能,特别是在验证流方面:FileInput的验证器在过滤器之前运行。它还自动注入并使用验证器,验证器还检查文件在上传过程中可能出现的错误

通过创建自定义的
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);
    }
}
这种方法的另一个好处是,您可以在应用程序中重复使用MyInputFilter来满足其他上传要求,只需做一些小的改进。(参数化mime类型和大小值等)

$filter = new \Application\InputFilter\MyFileFilter($get_file);

if($filter->isValid()) {
    // ...
}