2012-08-23 10 views
7

W Symfony mogę zaakceptować typy MIME używając:Przesyłanie plików: Jak wykluczyć typ MIME za pomocą znaków zachęty?

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

Ale jak mogę wykluczyć coś z tej listy? Powiedzmy, że chcę zezwolić na wszystkie przesłane pliki oprócz plików PHP?

+1

Obawiam się, że trzeba tworzyć własne ograniczenia ... – Florent

+0

Hm, to co ja pomyślałem. Wielkie dzięki za wyjaśnienie tego. – insertusernamehere

+3

Powinieneś ** zawsze ** dodać do białej listy zamiast czarnej listy, po prostu wpisz mimeTypes, które akceptujesz, zamiast nie pozwalać na – JamesHalsall

Odpowiedz

4

Można zaimplementować numer Callback constraint za pośrednictwem dowodu tożsamości. Zaletą tej metody jest możliwość zastosowania komunikatu o błędzie do dowolnego pola (lub pól) w formularzu.

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

Nie musisz tworzyć żadnego oddzwaniania, aby to zrobić. Wystarczy upewnić się:

1) Ustaw parametr enable_annotations jako prawdziwe w app/config/config.yml:

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

2) Dołącz właściwie ograniczeń sprawdzania poprawności pliku podmiotu.

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

3) Użyj adnotacji prawidłowo. Przykład:

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

Powyższy kod działa poprawnie na mojej Symfony 2.3.9.

[] s

+1

Myślę, że źle zrozumiałeś pytanie. OP musi Akceptować * dowolne * mimeTypes ** ALE ** niektóre. – Touki

+0

Masz rację! Przepraszam, byłem też w innym pytaniu i odpowiedziałem niewłaściwym. Mój błąd! =) – brunoric

Powiązane problemy