0

私のSymfonyアプリケーションでは、ファイルのアップロード中にzipファイルをmimeタイプの1つとして設定したいのですが、これを行うためのコードは次のとおりです。

    $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ましpnggif。アップロードできない唯一のmimeタイプは、で終わるファイルです.zip

ここで何が問題になっていますか?

私はここで関連しているが異なる質問をしました。

注:私はSymfony1.2.7を使用しています

編集:私はさまざまなブラウザでさらにテストを行いました。Firefox3は「application/octet-stream」のために機能しますが、IEは「application / x-zip-compressed」のために機能しますが、GoogleChromeはまったく機能しません。

4

4 に答える 4

1

さらにテストした結果、これはSymfonyのバグだと思います。

于 2009-05-13T08:56:53.780 に答える
0

echoまたはerror_logを実行して、$ uploaded_file-> getMime()[または適切なメソッド呼び出しが何であれ]がzipファイルに対して何を返すかを確認します。

取得した文字列が配列に渡す文字列の1つである場合は、sfValidatorFileにバグがある可能性があり(私はこれを使用したことがありません)、ymlバリデーターを使用してみてください。

于 2009-05-12T12:56:09.700 に答える
0

これは、mimeタイプの検出に関する問題です。sfValidatorFileは、ユーザー提供の関数を使用してmimeタイプを判別できます。そのため、バリデーターによって決定されたmimeタイプが正しく機能しない場合に、アップロードされたファイルからzipファイルを検出する独自の関数を作成できます。

ドキュメントへのリンク、ファイルのアップロードについて説明しているページの最後をご覧ください。

于 2009-05-13T08:24:35.940 に答える
0

解決策があります:

  1. 「/lib/Validator/」に「sfValidatorFileZip.class.php」を作成します。このクラスは、コミュン「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')));
    
于 2012-05-10T12:11:48.797 に答える