Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2][Symfony2]Błędny MIME-TYPE plików
Forum PHP.pl > Forum > PHP > Frameworki
macq
Witam,

czy ktoś z Was napotkał problemy związane z wykrywaniem MIME-TYPE korzystając z Symfony\Component\HttpFoundation\File\File::getMimeType()?

Właśnie zrobiłem test na kilku rodzajach plików i wyszły mi bardzo dziwne wyniki:
pliki/Kalimba.mp3 - application/octet-stream (powinno być: audio/mpeg)
pliki/Aplikacja.docx - application/zip (powinno być: application/vnd.openxmlformats-officedocument.wordprocessingml.document)
pliki/Wildlife.wmv - video/x-ms-asf (powinno być: video/x-ms-wmv)

Rozszerzenia również są źle wykrywane i jestem niemal pewny że związane to jest z MIME TYPE.

dla plików Desert.jpg, Oferta.pdf, Zrzut.png, lista.txt typy MIME i rozszerzenia wykrywane są poprawnie.


Może ktoś z Was wie dlaczego tak się dzieje i jak sobie z tym poradzić? Walczę z tym już od rana, przeszukałem sieć bez skutecznie i powoli nie starcza mi na to sił... Będę mega wdzięczny za pomoc!

Moje środowisko to:
Ubuntu 12.04
PHP 5.5.1
Apache 2.4.6

Pozdrawiam,
Maciek
cadavre
Wg dokumentacji:
Kod
public string|null getMimeType()
Returns the mime type of the file.
The mime type is guessed using a MimeTypeGuesser instance, which uses finfo(), mimecontenttype() and the system binary "file" (in this order), depending on which of those are available.


http://api.symfony.com/2.3/Symfony/Compone...e/MimeType.html - tak wygląda struktura owych guesserów.
https://github.com/symfony/HttpFoundation/t...r/File/MimeType - tutaj masz ich kod.
finfo_open() działa domyślnie dla PHP od 5.3 i wykorzystuje tzw. "magiczną sekwencję bajtów", których baza przechowywana jest w /etc/magic.

Sprawdź, który guesser wykorzystywany jest w Twoim projekcie, jeśli on okaże się felerny - uzupełnij wymagania, żeby skorzystać z lepszego. Albo napisz takiego guessera sam. : )
macq
@cadavre - dzięki za odpowiedź, przyznam się że już myślałem aby w ten sposób się do tego dobrać ale czy nie uważasz że lepszym rozwiązaniem będzie zaktualizowanie bazy dla finfo_open?

No i finfo_open() korzysta z pliku w /usr/share/misc/magic (binarny), a nie /etc/magic (tekstowy). Co ciekawe korzystając z /etc/magic MIME TYPE wykrywany jest poprawnie.
cadavre
Teraz to już zależy tylko na co możesz sobie pozwolić w kodzie i na serwerze. Z tego co widzę MimeTypeGuesser tworzy instancję bez podawania magic file.
Zatem zgodnie z http://php.net/manual/en/function.finfo-open.php możesz albo nadpisać MimeTypeGuesser'a w Symfony2 i ustawić swoją ścieżkę, albo ustawić zmienną env MAGIC, z której skorzysta finfo. Jeśli ani jedno ani drugie nie jest ustawione wykorzystywana jest baza dostarczona z dystrybucją PHP, teoretycznie zatem przestarzała.
macq
@cadavre - Wielkie dzięki za pomoc! Na razie okroiłem funkcjonalność modułu do plików dla których mime type jest wykrywany poprawnie ale na pewno w przeciągu kilku dni wrócę do tego aby obsłużyć kolejne typy. Dam znać czy mi się udało i w jaki sposób to zrobiłem.

Pozdrawiam,
Maciek
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.