2012-08-23 8 views
7

In Symfony kann ich MIME-Typen akzeptieren mit:Datei-Upload: Wie kann man einen MIME-Typ mit Asserts ausschließen?

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

Aber wie kann ich etwas von dieser Liste ausgeschlossen werden? Nehmen wir an, ich möchte alle Uploads außer PHP-Dateien erlauben?

+1

Ich habe Angst, dass Sie Ihre eigene Einschränkung erstellen müssen ... – Florent

+0

Hm, das ist, was ich dachte. Vielen Dank für das Aufräumen. – insertusernamehere

+3

Sie sollten ** immer ** Whitelist anstatt Blacklist, nur die MimeTypes auflisten, die Sie zulassen, anstatt – JamesHalsall

Antwort

4

Sie könnten eine Callback constraint über eine Assert implementieren. Ein Vorteil dieser Methode besteht darin, dass Sie die Fehlermeldung auf jedes Feld (oder Felder) in Ihrem Formular anwenden können.

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

Sie müssen keinen Callback erstellen, um dies zu tun. So stellen Sie sicher:

1) Set enable_annotations Parameter als wahr in Ihrem app/config/config.yml:

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

2) Fügen Sie richtig die Validierung Einschränkungen auf Ihrer Entity-Datei.

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

3) Verwenden Sie die Anmerkung richtig. Beispiel:

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

Der obige Code funktioniert gut auf meinem Symfony 2.3.9.

[] s

+1

Ich denke, du hast die Frage falsch verstanden. OP muss * any * mimeTypes ** ABER ** einige akzeptieren. – Touki

+0

Sie haben Recht! Entschuldigung, ich war auch in einer anderen Frage und habe die falsche beantwortet. Mein Fehler! =) – brunoric