2015-04-24 18 views
10

OK, próbuję przesłać wideo i zatwierdzić typ pliku.Laravel 5 Walidacja mima

Zgodnie z dokumentacją:

mimes:foo,bar,...

The file under validation must have a MIME type corresponding to one of the listed extensions.

Basic Usage Of MIME Rule

'photo' => 'mimes:jpeg,bmp,png'

mam przesyłania wideo WMV, a moje zasady są tak:

return [ 
    'file' => ['required', 'mimes:video/x-ms-wmv'] 
] 

Zrobiłem print_r() na Request::file('file') i pojawia się następujący data:

Symfony\Component\HttpFoundation\File\UploadedFile Object 
(
    [test:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 
    [originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => SampleVideo.wmv 
    [mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => video/x-ms-wmv 
    [size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 70982901 
    [error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0 
    [pathName:SplFileInfo:private] => C:\wamp\tmp\php6428.tmp 
    [fileName:SplFileInfo:private] => php6428.tmp 
) 

Jednak pojawia się błąd:

{"file":["The file must be a file of type: video\/x-ms-wmv."]} 

Próbowałem zmienić „typ MIME” do video/*, wmv (zgodnie z docs), a także video/x-ms-wmv jeszcze żaden z nich sprawdzić poprawność pliku poprawnie.

Jak widać z print_r() typu MIME Symfony jest coraz jestvideo/x-ms-wmv.

Czy robię coś nie tak? A może Laravel/Symfony po prostu nie sprawdza poprawności plików?

I docenić pomocy

Edycja Ok, otwarty validator.php i dodatkowe echo $value->guessExtension(); sposobu ValidateMimes() i wyprowadza ASF.

Dlaczego Symfony wyprowadza video\x-ms-wmv, rozszerzenie pliku to wmv, sprawdzam ich obu, ale Laravel zgaduje asf?!

To zbyt niewiarygodne dla weryfikacji wideo dla mnie.

+0

Też miałem ten problem, a problem był z wersją PHP, której używałem, spróbuj stworzyć plik php i sprawdź typ MIME wideo z funkcją Fileinfo http://php.net/manual/en/ book.fileinfo.php –

Odpowiedz

12

To oczekiwane zachowanie.

Laravel is nazywając guessExtension na UploadedFile obiektu Symphony, który powróci do oczekiwanego rozszerzenie pliku, a nie mimeType.

Dlatego documenatation stwierdza, że ​​do przesłanego obrazu należy użyć:

'photo' => 'mimes:jpeg,bmp,png'

Symfony za guessExtensiongetMimeType połączeń, który używa PHP Fileinfo Functions iść i odgadnąć typ MIME danego pliku.

Po tym, jak getMimeType zgadnie typ MIME pliku, Symfony's MimeTypeExtensionGuesser kopie, aby uzyskać rozszerzenie z typu MIME pobranego z pliku.

// ... cut from MimeTypeExtensionGuesser 
    'video/x-ms-asf' => 'asf', 
    'video/x-ms-wmv' => 'wmv', 
    'video/x-ms-wmx' => 'wmx', 
    'video/x-ms-wvx' => 'wvx', 
    'video/x-msvideo' => 'avi', 

Dlatego wasze zasady powinny być:

return [ 
    'file' => ['required', 'mimes:wmv,asf'] 
] 

Powodem że asf powinny być zawarte jest głównie historyczne. Cytując Wikipedię: dokumentacja

The most common media contained within an ASF file are Windows Media Audio (WMA) and Windows Media Video (WMV). The most common file extensions for ASF files are extension .WMA (audio-only files using Windows Media Audio, with MIME-type ' audio/x-ms-wma ') and .WMV (files containing video, using the Windows Media Audio and Video codecs, with MIME-type ' video/x-ms-asf '). These files are identical to the old .ASF files but for their extension and MIME-type.

Microsoft o the difference between ASF and WMV/WMA files stany:

The only difference between ASF files and WMV or WMA files are the file extensions and the MIME types [...] The basic internal structure of the files is identical.

Ponieważ wewnętrzna struktura pliku jest identyczna (w tym magic numbers dla formatu pliku), wmv, wma i asf są jednym i tym samym. Jedyną różnicą między trzema rozszerzeniami jest ikona wyświetlana w Eksploratorze.

To nie tylko pliki Windows Media będą miały ten problem, Wikipedia lists wiele różnych formatów kontenerów wideo, które będą miały ten sam problem. Jeśli chcesz znaleźć kodek wideo kodek wideo, który jest używany w kontenerze, będziesz musiał spojrzeć na więcej niż tylko "magic patterns", które są używane przez funkcje fileinfo.


Mając na uwadze powyższe, oczekiwane zachowanie! = poprawne zachowanie.

Przesłałem pull request, aby dodać nowy weryfikator o nazwie mimetypes. Działa to tak, jak się spodziewasz, i używa zgadywanego typu MIME do sprawdzania poprawności przesłanego pliku, zamiast rozszerzenia, które jest odgadywane na podstawie typu MIME.

+0

Dzięki za wyjaśnienie, czy wiesz, czy miałem po prostu pecha wybrać "trudny" typ pliku (wmv/asf) lub czy ma to miejsce z wieloma innymi typami plików (to znaczy, oczekuję, że mp4, ale "odgaduje" na przykład inne rozszerzenie? –

+0

@PhilCross, to głównie tylko WMV/ASF, który ma ten problem. mp4 przeszedł znacznie lepszy proces standaryzacji :) (chociaż nadal możesz mieć problem, gdy pliki .mpv są oznaczane jako mp4 itd., ale tego można się spodziewać - tzn. chcesz, aby pliki 'jpeg' były oznaczone jako' jpg', itp.). Problem z 'wmv' jest formatem kontenerowym, takim jak' mkv', więc tylko dlatego, że ma ".wmv" na końcu, nie oznacza to, że używa on formatu 'Windows Media Video'. – timgws

+0

Dziękuję za kolejne wyjaśnienie! Otrzymam +1 od odpowiedzi :) –