Frage

Ich habe einen Web-App, wo der Benutzer eine ZIP-Datei zum Hochladen braucht. Auf der Server-Seite, ich bin Überprüfung der Mime-Typ der hochgeladenen Datei, um sicherzustellen, dass es application/x-zip-compressed oder application/zip.

Das funktionierte gut für mich auf Firefox und IE. Wenn jedoch ein Mitarbeiter getestet, konnte es für ihn auf Firefox (gesendet Mime-Typ war so etwas wie „application/octet-stream“), sondern arbeitete im Internet Explorer. Unsere Setups scheinen identisch zu sein: IE8, FF 3.5.1 mit allen Add-ons deaktiviert, Win XP SP3, WinRAR installiert als native ZIP-Datei-Handler (nicht sicher, ob das relevant)

.

Also meine Frage ist: Wie funktioniert der Browser bestimmen, welche MIME-Typ senden

Bitte beachten Sie: Ich weiß, dass der MIME-Typ durch den Browser gesendet wird und daher unzuverlässig. Ich bin Überprüfung es nur als Komfort - vor allem einer freundlichere Fehlermeldung zu geben, als die, die Sie, indem Sie versuchen erhalten eine nicht-Zip-Datei als Zip-Datei zu öffnen, und die (vermutlich schwer) Zip-Datei Bibliotheken laden zu vermeiden.

War es hilfreich?

Lösung

Chrome

Chrome (Version 38 als Schreib) hat 3 Möglichkeiten, den MIME-Typen und tut dies in einer bestimmten Reihenfolge zu bestimmen. Das Snippet unten ist aus der Datei src/net/base/mime_util.cc, Methode MimeUtil::GetMimeTypeFromExtensionHelper.

// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type.  That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.

Die hartcodierte Listen kommen etwas früher in der Datei: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 (kPrimaryMappings und kSecondaryMappings).

Ein Beispiel: Wenn Sie eine CSV-Datei von einem Windows-System mit Microsoft Excel installiert Hochladen Chrome wird diesen Bericht als application/vnd.ms-excel. Dies liegt daran, .csv nicht in der ersten hartcodierte Liste angegeben wird, so dass der Browser auf die System-Registry zurückfällt. HKEY_CLASSES_ROOT\.csv hat einen Wert namens Content Type, die festgelegt wird application/vnd.ms-excel.

Internet Explorer

Auch hier das gleiche Beispiel verwenden, wird der Browser application/vnd.ms-excel melden. Ich denke, es ist vernünftig Internet Explorer (Version 11 als Schreib) verwendet die Registrierung zu übernehmen. Möglicherweise es auch die Verwendung einer hartcodierte Liste wie Chrome und Firefox macht, aber seine Closed-Source-Natur macht es schwer zu überprüfen.

Firefox

Wie in dem Chrome-Code angegeben, Firefox (Version 32 als Schreib) arbeitet in ähnlicher Weise. Schnipsel aus einer Datei uriloader\exthandler\nsExternalHelperAppService.cpp, Methode nsExternalHelperAppService::GetTypeFromExtension

// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category

Die hartcodierte Listen kommen früher in der Datei, irgendwo in der Nähe von Linie 441. Sie suchen defaultMimeEntries und extraMimeEntries.

Mit meinem aktuellen Profil, wird der Browser text/csv berichten, weil es ein Eintrag für es in mimeTypes.rdf (Punkt 2 in der obigen Liste). Mit einem frischen Profil, das nicht diesen Eintrag hat, wird der Browser melden application/vnd.ms-excel (Punkt 3 in der Liste).

Zusammenfassung

Die hartcodierte Listen in den Browsern sind ziemlich begrenzt. Oft wird der MIME-Typ durch den Browser gesendet derjenige von den OS gemeldet werden. Und das ist genau, warum, wie in der Frage angegeben, der MIME-Typ vom Browser gemeldet ist unzuverlässig.

Andere Tipps

Kip, verbrachte ich einige Zeit RFCs, MSDN und MDN zu lesen. Hier ist, was ich verstehen kann. Wenn ein Browser eine Datei zum Hochladen trifft, sieht es auf dem ersten Puffer von Daten läuft er empfängt und dann einen Test auf ihn. Diese Tests versuchen, um zu bestimmen, ob die Datei ein bekannter Mime-Typ ist oder nicht, und wenn Mime-Typen bekannt, wird es einfach testet es weiter für den bekannten MIME-Typen und handelt entsprechend. Ich denke, IE diese zuerst zu tun versucht, anstatt nur den Dateityp von der Verlängerung zu bestimmen. Diese Seite erklärt dies für IE http: // msdn .microsoft.com / en-us / library / ms775147% 28v = VS.85% 29.aspx . Für firefox, was ich konnte, war verstehen, dass es versucht, bestimmt Dateiinfos von Dateisystem oder Verzeichniseintrag zu lesen und dann den Dateityp. Hier ist ein Link für FF https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIFile. Ich möchte noch mehr Autorität Informationen über diese haben.

Dies ist wahrscheinlich O und möglicherweise Browser abhängig, aber unter Windows, der MIME-Typ für eine bestimmte Dateierweiterung kann, indem Sie in der Registrierung unter HKCR gefunden werden:

Zum Beispiel:

HKEY_CLASSES_ROOT.zip - Content

Um von MIME zu gehen Erweiterung Datei, können Sie an den Tasten unter

aussehen

HKEY_CLASSES_ROOT \ Mime \ Database \ Content Type

Um die Standarderweiterung für einen bestimmten MIME-Typen zu erhalten.

Dies ist zwar nicht eine Antwort auf Ihre Frage ist, es löst das Problem, das Sie versuchen zu lösen. YMMV.

Wie Sie schrieb, MIME-Typ ist nicht zuverlässig, da jeder Browser seine Art und Weise hat es zu bestimmen. Allerdings Browser die ursprünglichen Namen (einschließlich Erweiterung) sendet die Datei. So ist die beste Art und Weise mit dem Problem umzugehen ist, die Erweiterung der Datei zu überprüfen, anstatt der MIME-Typs.

Wenn Sie immer noch den Mime-Typ, dann können Sie Ihre eigenen Apache mime.types verwenden, um es serverseitige zu bestimmen.

Ich bin mit johndodo, es gibt so viele Variablen, die MIME-Typen zu machen, die unzuverlässig von Browsern gesendet werden. Ich würde die Subtypen ausschließen, die empfangen werden und nur konzentrieren sich auf die Art wie ‚Anwendung‘. wenn Ihre Anwendung PHP basiert, können Sie einfach das tun, indem die Funktion explode () verwenden. Darüber hinaus überprüfen Sie die Dateierweiterung um sicherzustellen, dass es .zip oder andere Kompressions ist, dass Sie suchen!

Nach RFC1867 - formularbasierte Datei-Upload in HTML :

  

Jeder Teil sollte mit einem geeigneten Content-Typ, wenn die beschriftbar   Medientyp ist bekannt (beispielsweise aus der gefolgerten Dateierweiterung oder   Betriebssystem eingeben Informationen) oder als application / octet-stream.

Also mein Verständnis ist, application/octet-stream ist wie eine Art von blanket catch-all Kennung, wenn der Typ kann nicht sein inferred .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top