Установите mime_types не работает для zip-файла в Symfony - PullRequest
0 голосов
/ 12 мая 2009

В моем приложении 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

Редактировать: я провел дополнительное тестирование с различными браузерами. Firefox 3 работает из-за 'application / octet-stream' ', тогда как IE работает из-за' application / x-zip-compress ', Google Chrome вообще не работает.

Ответы [ 4 ]

1 голос
/ 13 мая 2009

После дальнейшего тестирования , я считаю, что это ошибка в Symfony.

0 голосов
/ 10 мая 2012

Есть решение:

  1. создайте свой "sfValidatorFileZip.class.php" в своем "/ lib / Validator /". Этот класс является расширением класса "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. в вашей форме, виджет будет экземпляром из вашего пользовательского "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')));
    
0 голосов
/ 13 мая 2009

это проблема с обнаружением типа пантомимы. sfValidatorFile может использовать предоставленную пользователем функцию для определения типа пантомимы. так что вы можете написать свою собственную функцию для обнаружения zip-файлов из загруженного файла, если тип mime, определенный валидатором, не выполняет свою работу правильно.

ссылка на документацию , посмотрите в конце страницы, объясняющей загрузку файлов.

0 голосов
/ 12 мая 2009

Сделайте echo или error_log, чтобы увидеть, что $ uploaded_file-> getMime () [или любой другой правильный вызов метода] возвращает для ваших zip-файлов.

Если полученная вами строка является одной из строк, передаваемых в массив, может быть ошибка с sfValidatorFile (я никогда не использовал ее), и вы можете попробовать использовать валидатор yml.

...