2014-10-01 12 views
10

Javascript (Windows 8.1, Firefox) wydaje się nie mieć typów MIME dla plików .tar lub plików .rar (i być może innych, to są tylko dwie, które znalazłem) . Co z tym? Czy jest coś, co mogę użyć, aby rozwiązać ten problem? Naprawdę chciałbym móc pobierać typy MIME dla tych typów plików bez wykonywania dziwnych hackowania rozszerzeń.Brakuje typu Mime dla .rar i .tar

Zrobiłem skrzypce okazać się problem: http://jsfiddle.net/kungfujoe/jd8h7wvs/

Jeśli przejdziesz do txt, lub .docx lub wiele innych formatów, typ jest ciągnięty pomyślnie. Jednak zarówno .tar, jak i .rar ich nie ciągną. Dziwne, prawda?

(kod JSFiddle poniżej)

HTML

<input id='button' type='file' name='file'/> 
<div id='out'>Output Goes Here</div> 

JavaScript (przy użyciu JQuery 2.1.0)

$('#button').unbind('change'); 
$('#button').bind('change', function() { 
    if(this.files[0] !== undefined && this.files[0] !== null) { 
     document.getElementById("out").innerHTML = "Type is " + this.files[0].type.toString();   
    } else { 
     throw "Error" 
    } 
}); 

Dzięki

EDIT

1) Zaktualizowane pytanie, które ma odzwierciedlać, że problem został zaobserwowany w systemie Windows 8.1 Firefox. Chrome ma typ MIME dla plików tar, ale nie pliki rar.

2) Dodane jQuery do Fiddle

+2

Nie dodano jQuery do skrzypiec. Potwierdzono, że nie pracuję z plikami tar. – DanFromGermany

+1

Jakiego systemu operacyjnego używasz? Możliwe, że przeglądarka deleguje do systemu operacyjnego, aby rozwiązać typ MIME, lub nie ma powiązania w konfiguracji przeglądarki między tym rozszerzeniem pliku a jego typem MIME. Próbuję skonfigurować przeglądarkę, aby wiedzieć, który zewnętrzny program powinien otworzyć plik .tar lub .rar. Może to pomoże? –

+1

Jest OK dla rar i tar, zwraca: Typ to application/x-rar (lub x-tar) w MacOs/Chrome. Na jakim OS/przeglądarce testujesz to? – enguerranws

Odpowiedz

11

JQuery tylko owija podstawowych API plików używane w większości przeglądarek, więc nie ma różnicy jak JQuery i JavaScript obsługi plików i typy MIME. Oto specyfikacja API pliku:

http://www.w3.org/TR/FileAPI/#dfn-type

File obiekt, który jesteś manipulowania dziedziczy własność typu z obiektu Blob, a przeglądarka korzysta z blob (tablicy bajtowej), aby określić typ MIME.

Aby to wykonać, każda przeglądarka implementuje algorytm wykrywania plików, aby "odczytać" typ MIME z tablicy bajtów, a jeśli typ MIME nie jest zgodny, zwróci pusty ciąg, jak w powyższym scenariuszu.

Oto pełny algorytm Spec:

https://mimesniff.spec.whatwg.org/

Więc teraz zastanawiasz się, dlaczego to nie działa dla TAR, ZIP i RAR plików i dlaczego to działa dla niektórych ludzi, a nie dla ty? .. ponieważ algorytm wykrywania plików jest ewidentnie nie idealny.

Używa on wzoru bajtowego pasującego do, a to wydaje się niewystarczająco niezawodne.

Na przykład Użyłem WinRAR na moim Windows 8 pole, aby skompresować plik, a początkowe bajty utworzonego pliku to:

52 61 72 21 1A 07 00

Jednak, aby go rozpoznać jako.RAR algorytm dopasowywania bajt przeglądarka wzór spodziewa

52 61 72 20 1A 07 00

Jak widać istnieje niewielka różnica, a kiedy dodałem plik RAR do przeglądarki przy użyciu wyżej kod, Firefox nie był w stanie rozpoznać Mime -Type, i mam pusty ciąg we właściwości type.

Jednak, gdy spakowałem plik ZIP za pomocą WinRar na tym samym komputerze z ustawieniami domyślnymi, generuje on początkową sekwencję bajtów o numerze 50 4B 03 04, która jest zgodna ze wzorem bajtów zip oczekiwanym przez algorytm i kiedy użyłem twojego kodu powyżej. był w stanie wykryć typ mime poprawnie jako aplikacja /zip!

Jak widać z moich wyjaśnień, jest to kwestia serializacji i "niedoskonałości" algorytmu, który pasuje do serializowanych bajtów z rozszerzeniami mime w przeglądarkach.

W oparciu o wszystko, co zostało powiedziane powyżej, poleciłbym NIE poleganie na sniffowaniu mimem, a zamiast tego użyj własnego kodu do określenia typu MIME LUB istniejących bibliotek. Możesz użyć podejścia po stronie serwera lub po stronie klienta.

Jeśli chcesz trzymać klienta można wykorzystać następujące JS Biblioteka:

https://github.com/rsdoiel/mimetype-js

A potem odkrywanie typ MIME będzie kwestia jednego wiersza kodu:

Oto działające skrzypce, uaktualniając przykład użycia typu MIME:

http://jsfiddle.net/jd8h7wvs/4/

+1

Po prostu dodaj, jeśli nie było to jasne: "mimetype.js" to prosta tabela odnośników. Działa na podstawie rozszerzenia pliku i wyszukiwania w katalogu odpowiedniego typu. – Academia

+0

Fantastyczne. Właśnie tego szukałem. Nagroda jest cała twoja (i jest zasłużona, jeśli sama tak powiem). –

+0

... w ciągu 16 godzin (dodam go do mojej listy zadań) –

Powiązane problemy