设置mime_types不适用于Symfony中的zip文件

时间:2009-05-12 09:56:13

标签: symfony1 mime-types

在我的Symfony应用程序中,我想在文件上传期间将zip文件设置为mime类型之一,执行此操作的代码如下:

    $this->validatorSchema ['Documents'] = new sfValidatorFile ( 
        array ('mime_types' => array(
        'application/zip', 
        'image/jpeg',
    'image/pjpeg',
    'image/png',
    'image/x-png',
   'image/gif',
        'application/x-zip',
        'application/octet-stream',
        'application/pdf') ), 
        array ('invalid' => 'Invalid file.',
         'required' => 'Select a file to upload.', 
         'mime_types' => 'The file must be of JPEG, PNG , GIF, pdf and zip format.' ) );

但是,当我上传时,我发现可以上传所有pdfpnggif等。唯一无法上传的mime类型是以.zip结尾的文件。

这里出了什么问题?

我问了一个相关但不同的问题here

注意:我使用的是Symfony 1.2.7

编辑:我使用不同的浏览器做了一些进一步的测试。 Firefox 3的工作原因是“application / octet-stream”,而IE的工作原因是“application / x-zip-compressed”,而Google Chrome根本不起作用。

4 个答案:

答案 0 :(得分:1)

more testing之后,我相信Symfony中的this is a bug

答案 1 :(得分:0)

执行echo或error_log以查看$ uploaded_file-> getMime()[或任何正确的方法调用]返回的zip文件。

如果您获得的字符串是传递给数组的字符串之一,则可能存在sfValidatorFile的错误(我从未使用过它),您可能想尝试使用yml验证器。

答案 2 :(得分:0)

这是mime类型检测的问题。 sfValidatorFile可以使用用户提供的函数来确定mime类型。因此,如果由验证器确定的mime类型不能正常工作,您可以编写自己的函数来检测上传文件中的zip文件。

link to documentation,请查看解释文件上传的页面末尾。

答案 3 :(得分:0)

有一个解决方案:

  1. 在“/ lib / Validator /”中创建“sfValidatorFileZip.class.php”。这个类从commun“sfValidatorFile”扩展而来,它包含下面列出的“configure”方法:

    class sfValidatorFileZip extends sfValidatorFile{
      protected function configure($options = array(), $messages = array()){
        if (!ini_get('file_uploads'))
        {
          throw new LogicException(sprintf('Unable to use a file validator as "file_uploads" is disabled in your php.ini file (%s)', get_cfg_var('cfg_file_path')));
        }
    
        $this->addOption('max_size');
        $this->addOption('mime_types');
        $this->addOption('mime_type_guessers', array(
          array($this, 'guessFromFileinfo'),
          array($this, 'guessFromMimeContentType'),
          array($this, 'guessFromFileBinary'),
        ));
        $this->addOption('mime_categories', array(
          'web_images' => array(
            'image/jpeg',
            'image/pjpeg',
            'image/png',
            'image/x-png',
            'image/gif',
        ),
          'zip_file' => array(
                'application/zip'
        )
            ));
        $this->addOption('validated_file_class', 'sfValidatedFile');
        $this->addOption('path', null);
    
        $this->addMessage('max_size', 'File is too large (maximum is %max_size% bytes).');
        $this->addMessage('mime_types', 'Invalid mime type (%mime_type%).');
        $this->addMessage('partial', 'The uploaded file was only partially uploaded.');
        $this->addMessage('no_tmp_dir', 'Missing a temporary folder.');
        $this->addMessage('cant_write', 'Failed to write file to disk.');
        $this->addMessage('extension', 'File upload stopped by extension.');
      }
    }
    
  2. 在您的表单中
  3. ,小部件将是您的自定义“sfValidatorFileZip”中的实例,您必须精确地'mime_types' => 'zip_file'。例如:

    $this->setValidator('filename', new sfValidatorFileZip(array(
                'required' => false,
                'mime_types' => 'zip_file',
                'path' => sfConfig::get('sf_upload_dir') . '/files/',), 
                array('required' => 'filename is required.', 'mime_types' => 'only ZIP is accepted')));