检测和验证 ZF2 中的 MIME 类型


Detecting and validating Mime Types in ZF2

我正在尝试限制某些文件类型在 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 有一个特殊的 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 类型和大小值等。