2009-05-12 2 views
0

В моем приложении Symfony я хочу установить почтовый файл в качестве одного из типов пантомимы во время загрузки файла, код, чтобы сделать это ниже:Набор mime_types не работает для архива в Symfony

$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.

Что здесь не так?

Я спросил связанный, но другой вопрос here.

Примечание: Я использую Symfony 1.2.7

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

ответ

0

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

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

0

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

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

0

Существует решение:

  1. создать "sfValidatorFileZip.class.php" в вашем "/ Lib/Оценщика /". Этот класс простирается от коммун «sfValidatorFile» и содержат «настроить» Methode, как указано ниже:

    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')));