2014-10-01 8 views
10

Javascript (Windows 8.1, Firefox) scheint keine MIME-Typen für .tar-Dateien oder .rar-Dateien (und vielleicht andere; das sind die einzigen beiden, die ich gefunden habe) . Was ist damit? Gibt es etwas, das ich verwenden kann, um dies zu lösen? Ich würde wirklich gerne in der Lage sein, Mime-Typen für diese Dateitypen abzurufen, ohne ein seltsames Extension-Hacking durchzuführen.Mime-Typ fehlt für .rar und .tar

machte ich eine Geige, die Frage zu beweisen: http://jsfiddle.net/kungfujoe/jd8h7wvs/

Wenn Sie in eine .txt durchsuchen oder .docx oder so viele andere Formate wird die Art erfolgreich gezogen. Sowohl .tar als auch .rar ziehen sie jedoch nicht. Seltsam, oder?

(JSFiddle Code unten)

HTML

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

Javascript (mit 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" 
    } 
}); 

Dank

EDIT

1) Aktualisierte Frage, um zu zeigen, dass das Problem unter Windows 8.1 Firefox beobachtet wurde. Chrome hat einen MIME-Typ für TAR-Dateien, aber keine RAR-Dateien.

2) hinzugefügt jQuery zum Fiddle

+2

Sie haben jQuery nicht zu Ihrer Geige hinzugefügt. Bestätigt, nicht mit tar-Dateien zu arbeiten. – DanFromGermany

+1

Mit welchem ​​Betriebssystem arbeiten Sie? Es kann sein, dass der Browser an das Betriebssystem delegiert, um den MIME-Typ aufzulösen, oder dass in der Browserkonfiguration keine Verbindung zwischen dieser Dateierweiterung und ihrem MIME-Typ besteht. Versuchen Sie, Ihren Browser so zu konfigurieren, dass er weiß, welches externe Programm eine .tar- oder .rar-Datei öffnen soll. Vielleicht hilft das? –

+1

Es ist in Ordnung für Rar und Teer, es gibt zurück: Typ ist Anwendung/X-Rar (oder X-Tar) auf MacOs/Chrome. Auf welchem ​​Betriebssystem/Browser testen Sie es? – enguerranws

Antwort

11

JQuery wickelt nur den zugrunde liegenden Datei-API in den meisten Browsern verwendet wird, so gibt es keinen Unterschied, wie JQuery und Javascript-Dateien und MIME-Typen verarbeiten. Hier ist die Datei-API-Spezifikation:

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

Das File Objekt, das Sie erbt die Typ Eigenschaft aus dem Blob Objekt manipulieren, und der Browser verwendet den Blob (Byte-Array), um den MIME-Typ zu bestimmen.

Um diese Aufgabe zu erfüllen, implementiert jeder Browser einen Datei-Sniffing-Algorithmus, um den MIME-Typ aus dem Byte-Array zu lesen, und wenn der MIME-Typ nicht übereinstimmt, gibt er eine leere Zeichenfolge wie in Ihrem obigen Szenario zurück. Hier

ist der vollständige Algorithmus spec:

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

So, jetzt Sie fragen sich, warum es nicht für TAR, ZIP und RAR-Dateien funktioniert, und warum es für manche Menschen funktioniert und nicht für Sie? .. weil der Datei-Sniffing-Algorithmus offensichtlich nicht perfekt ist.

Es verwendet Byte-Muster passend, und das scheint nicht zuverlässig genug.

Zum Beispiel habe ich WinRaR auf meinem Windows-8-Box verwendet, um eine Datei zu komprimieren, und das erste Bytes der erstellten Datei ist:,

52 61 72 21 1A 07 00

jedoch als zu erkennen.RAR der Browser-Byte-Pattern-Matching-Algorithmus erwartet

52 61 72 20 1A 07 00

Wie Sie sehen, dass es ein kleiner Unterschied ist, und wenn ich meine RAR-Datei in den Browser hochgeladen Ihren Code oben, Firefox war nicht in der Lage, die Mime zu erkennen -Type, und ich habe eine leere Zeichenfolge in der Eigenschaft type.

Wenn ich jedoch eine ZIP-Datei mit WinRar auf dem gleichen Computer mit Standardeinstellungen gepackt hat, erzeugt es eine erste Byte-Array-Sequenz von 50 4B 03 04, die mit dem vom Algorithmus erwarteten Zip-Byte-Muster übereinstimmt, und wenn ich den Code darüber verwendete war in der Lage, den Mime-Typ richtig als Anwendung/zip zu erkennen!

Wie Sie aus meiner Erklärung sehen, ist es eine Frage der Serialisierung und der "Unvollkommenheit" des Algorithmus, der die serialisierten Bytes mit Pantomime-Erweiterungen in den Browsern übereinstimmt.

Basierend auf allem, was oben erwähnt wurde, würde ich empfehlen, sich NICHT auf das Mime Sniffing zu verlassen, und stattdessen Ihren benutzerdefinierten Code verwenden, um den MIME-Typ ODER vorhandene Bibliotheken zu bestimmen. Sie können einen serverseitigen oder einen clientseitigen Ansatz verwenden.

Wenn Sie an den Client bleiben Sie folgende JS-Bibliothek verwenden:

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

Und dann den Mime-Typ entdecken eine Frage der eine Zeile Code wäre:

Hier ist ein funktionierendes Fiddle, Ihr Beispiel ein Upgrade MIME-Typ js zu verwenden:

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

+1

Fügen Sie einfach hinzu, wenn es nicht klar war: Die "mimetype.js" ist eine einfache Nachschlagetabelle. Es funktioniert basierend auf der Erweiterung der Datei und sucht in einem Katalog den entsprechenden Typ. – Academia

+0

Fantastisch. Genau das habe ich gesucht. Das Kopfgeld gehört ganz dir (und ist gut verdient, wenn ich es selbst sage). –

+0

... in 16 Stunden (Ich füge es meiner Todo-Liste hinzu) –