Symfony1 在Symfony中设置不适用于zip文件的mime_类型

Symfony1 在Symfony中设置不适用于zip文件的mime_类型,symfony1,mime-types,Symfony1,Mime Types,在我的Symfony应用程序中,我想在文件上载期间将zip文件设置为mime类型之一,执行此操作的代码如下: $this->validatorSchema ['Documents'] = new sfValidatorFile ( array ('mime_types' => array( 'application/zip', 'image/jpeg', 'image/pjpeg', 'image/png',

在我的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.' ) );
然而,当我上传时,我发现所有的
pdf
png
gif
等都可以上传。唯一无法上载的mime类型是以
.zip
结尾的文件

这里怎么了

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

注意:我使用的是Symfony 1.2.7


Edit:我用不同的浏览器做了一些进一步的测试。Firefox 3之所以能工作是因为“应用程序/八位字节流”,而IE之所以能工作是因为“应用程序/x-zip-compressed”,Google Chrome根本不起作用。

做一个回音或错误日志,看看$Upload\u file->getMime()[或任何正确的方法调用]为您的zip文件返回了什么


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

这是mime类型检测的问题。SFValidator文件可以使用用户提供的函数来确定mime类型。所以,如果验证器确定的mime类型不正确,您可以编写自己的函数从上传的文件中检测zip文件

,请看页面末尾解释文件上传的内容。

之后,我相信在Symfony中

有一个解决方案:

  • 在“/lib/Validator/”中创建“sfValidatorFileZip.class.php”。此类从Common“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.');
      }
    }
    
  • 在您的表单中,小部件将是自定义“sfValidatorFileZip”的一个实例,您必须精确地指出
    'mime\u types'=>'zip\u 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')));