2012-08-23 4 views
7

In Symfony posso accettare tipi MIME utilizzando:Caricamento file: come escludere un tipo MIME usando gli asserti?

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

Ma come posso escludere qualcosa da quella lista? Diciamo, voglio consentire tutti i caricamenti tranne i file PHP?

+1

Ho paura che è necessario creare il proprio vincolo ... – Florent

+0

Hm, questo è quello che ho pensato. Mille grazie per averlo chiarito. – insertusernamehere

+3

Dovresti ** sempre ** lista bianca anziché lista nera, basta elencare i mimeTypes che permetti piuttosto che non consentire – JamesHalsall

risposta

4

È possibile implementare un Callback constraint tramite un assert. Un vantaggio di questo metodo è che è possibile applicare il messaggio di errore a qualsiasi campo (o campo) nel modulo.

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

Non è necessario creare alcuna richiamata per eseguire questa operazione. Basta fare in modo:

1) Impostare il parametro enable_annotations come vero nella tua app/config/config.yml:

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

2) Includere correttamente i vincoli di validazione sul vostro file di entità.

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

3) Utilizzare l'annotazione correttamente. Esempio:

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

Il codice sopra riportato funziona correttamente su Symfony 2.3.9.

[] s

+1

Penso che tu abbia frainteso la domanda. L'OP deve accettare * any * mimeTypes ** but ** some. – Touki

+0

Hai ragione! Scusa, ero in un'altra domanda e ho risposto a quello sbagliato. Colpa mia! =) – brunoric