检测和验证ZF2中的Mime类型

时间:2014-12-24 21:43:50

标签: php validation zend-framework2 mime-types

我试图限制某些文件类型在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类型。

有关于此的任何想法吗?

1 个答案:

答案 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类型和大小值等。)