2012-08-23 18 views
7

En Symfony puedo aceptar tipos MIME usando:Carga de archivos: ¿cómo excluir un tipo MIME utilizando afirmaciones?

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

Pero, ¿cómo puedo excluir algo de esa lista? Digamos que quiero permitir todas las cargas, excepto los archivos PHP.

+1

Me temo que usted necesita para crear su propia limitación ... – Florent

+0

Hm, eso es lo que pensé. Muchas gracias por aclarar eso. – insertusernamehere

+3

Debe ** siempre ** incluir en la lista blanca en lugar de en la lista negra, solo enumere los tipos de mime que permite en lugar de no permitir – JamesHalsall

Respuesta

4

Puede implementar un Callback constraint mediante una afirmación. Una ventaja de este método es que puede aplicar el mensaje de error a cualquier campo (o campos) en su formulario.

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

No es necesario crear ninguna devolución de llamada para hacer esto. Sólo asegúrese de que:

1) Conjunto de parámetros enable_annotations tan cierto en app/config/config.yml:

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

2) Incluir adecuadamente las restricciones de validación en el archivo de entidad.

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

3) Utilice la anotación correctamente. Ejemplo:

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

El código anterior está funcionando bien en mi Symfony 2.3.9.

[] s

+1

Creo que malinterpretaste la pregunta. OP necesita aceptar * any * mimeTypes ** BUT ** algunos. – Touki

+0

¡Tienes razón! Lo siento, también estaba en otra pregunta y respondí la incorrecta. ¡Mi error! =) – brunoric