2012-08-23 10 views
7

は、私が使用してMIMEタイプを受け入れることができます。ファイルのアップロード:アサーションを使用してMIMEタイプを除外する方法は? symfonyにおいて

/** 
    * @Assert\File(maxSize="10M", mimeTypes={"application/pdf", "image/png"}) 
    */ 
public $file; 

をしかし、どのように、私はそのリストから何かを除外することができますか? PHPファイル以外のすべてのアップロードを許可したいとします。

+1

私はあなたがあなた自身の制約を作成する必要があることが怖い... – Florent

+0

フム、それは私が考え出しものです。それをクリアしてくれてありがとう。 – insertusernamehere

+3

ブラックリストではなく常に**ホワイトリストにする必要があります。 – JamesHalsall

答えて

4

アサートでCallback constraintを実装できます。この方法の利点の1つは、エラーメッセージをフォームの任意のフィールドに適用できることです。

use Symfony\Component\Validator\ExecutionContext; 

/** 
* @ORM\Entity() 
* @Assert\Callback(methods={"validateFile"}) 
*/ 
class MyEntity 
{ 

    public function validateFile(ExecutionContext $context) 
    { 
     $path = $context->getPropertyPath(); 
     if (/* $this->file is not in allowed mimeTypes ... */) { 
      $context->setPropertyPath($path . '.file'); 
      $context->addViolation("Invalid file mimetype", array(), null); 
     } 
    } 
} 
4

これを行うためにコールバックを作成する必要はありません。念:あなたのアプリで

1)を設定しenable_annotationsパラメータとして真/設定/ config.yml:

# app/config/config.yml 
framework: 
    validation:  { enable_annotations: true } 

2)あなたの実体ファイルに適切に検証制約を含めます。

// YourEntity.php 
use Symfony\Component\Validator\Constraints as Assert; 

3)アノテーションを正しく使用してください。例:

// YourEntity.php 
/** 
* @Assert\File(
*  maxSize="5242880", 
*  mimeTypes = { 
*   "image/png", 
*   "image/jpeg", 
*   "image/jpg", 
*   "image/gif", 
*   "application/pdf", 
*   "application/x-pdf" 
*  } 
*) 
*/ 
private $arquivo; 

上記のコードは、私のSymfony 2.3.9で正常に動作しています。

[] S

+1

私はあなたがその質問を誤解していると思います。 OPは*任意の* mimeTypes **を受け入れる必要があります。 – Touki

+0

あなたは正しいです!申し訳ありませんが、私も別の質問にあって、間違った答えをしました。私の悪い! =) – brunoric

関連する問題