Question

J'ai une application Web sur laquelle l'utilisateur doit télécharger un fichier .zip. Sur le serveur, je vérifie le type mime du fichier téléchargé pour vérifier qu'il s'agit bien de application / x-zip-compressé ou de application / zip .

Cela a bien fonctionné pour moi sur Firefox et IE. Cependant, lorsqu'un collègue l'a testée, elle a échoué sous Firefox (le type mime envoyé ressemblait à " application / octet-stream ") mais fonctionnait sous Internet Explorer. Nos configurations semblent être identiques: IE8, FF 3.5.1 avec tous les add-ons désactivés, Win XP SP3, WinRAR installé en tant que gestionnaire de fichiers .zip natif (ne sachant pas si cela est pertinent).

Ma question est donc la suivante: Comment le navigateur détermine-t-il le type MIME à envoyer?

Remarque: je sais que le type MIME est envoyé par le navigateur et n'est donc pas fiable. Je le vérifie simplement pour des raisons de commodité - principalement pour donner un message d'erreur plus convivial que ceux que vous obtenez en essayant d'ouvrir un fichier non-zip en tant que fichier zip et d'éviter de charger les bibliothèques (supposément lourdes) de fichiers zip.

Était-ce utile?

La solution

Chrome

Chrome (version 38 à la date d'écriture) dispose de 3 façons de déterminer le type MIME et le fait dans un certain ordre. L'extrait de code ci-dessous provient du fichier src / net / base / mime_util.cc , méthode 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.

Les listes codées en dur apparaissent un peu plus tôt dans le fichier: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappings et kSecondaryMappings ).

Exemple: lors du téléchargement d'un fichier CSV à partir d'un système Windows sur lequel Microsoft Excel est installé, Chrome le signalera sous la forme application / vnd.ms-excel . En effet, .csv n'étant pas spécifié dans la première liste codée en dur, le navigateur revient au registre du système. HKEY_CLASSES_ROOT \ .csv a une valeur nommée Type de contenu définie sur application / vnd.ms-excel .

Internet Explorer

En utilisant à nouveau le même exemple, le navigateur Web signalera application / vnd.ms-excel . Je pense qu'il est raisonnable de supposer qu'Internet Explorer (version 11 au moment de l'écriture) utilise le registre. Peut-être utilise-t-il également une liste codée en dur comme Chrome et Firefox, mais son caractère source fermé le rend difficile à vérifier.

Firefox

Comme indiqué dans le code Chrome, Firefox (version 32 en écriture) fonctionne de manière similaire. Extrait du fichier uriloader \ exthandler \ nsExternalHelperAppService.cpp , méthode 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

Les listes codées en dur apparaissent plus tôt dans le fichier, quelque part près de la ligne 441. Vous recherchez defaultMimeEntries et extraMimeEntries .

Avec mon profil actuel, le navigateur signalera text / csv car il existe une entrée dans mimeTypes.rdf (élément 2 de la liste ci-dessus). Avec un nouveau profil, qui ne comporte pas cette entrée, le navigateur Web signalera application / vnd.ms-excel (élément 3 de la liste).

Résumé

Les listes codées en dur dans les navigateurs sont assez limitées. Souvent, le type MIME envoyé par le navigateur sera celui indiqué par le système d'exploitation. Et c’est précisément pourquoi, comme indiqué dans la question, le type MIME signalé par le navigateur n’est pas fiable.

Autres conseils

Kip, j'ai passé un certain temps à lire les RFC, MSDN et MDN. Voici ce que j'ai pu comprendre. Lorsqu'un navigateur rencontre un fichier à télécharger, il examine le premier tampon de données qu'il reçoit, puis exécute un test. Ces tests tentent de déterminer si le fichier est de type mime connu ou non. Si ce type de fichier est connu, il le testera simplement pour déterminer quel type de mime est connu et agira en conséquence. Je pense qu'IE essaie de faire cela en premier plutôt que de simplement déterminer le type de fichier à partir d'une extension. Cette page explique cela pour IE http: // msdn .microsoft.com / fr-us / library / ms775147% 28v = vs.85% 29.aspx . Pour Firefox, ce que je pouvais comprendre, c’est qu’il essaie de lire les informations sur les fichiers à partir d’un système de fichiers ou d’une entrée de répertoire, puis détermine le type de fichier. Voici un lien pour FF https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIFile. J'aimerais toujours avoir plus d'informations faisant autorité à ce sujet.

Ceci est probablement lié au système d'exploitation et peut-être au navigateur, mais sous Windows, le type MIME d'une extension de fichier donnée peut être trouvé en consultant le registre sous HKCR:

Par exemple:

HKEY_CLASSES_ROOT.zip - ContentType

Pour passer de MIME à une extension de fichier, vous pouvez regarder les clés sous

HKEY_CLASSES_ROOT \ Mime \ Base de données \ Type de contenu

Pour obtenir l'extension par défaut pour un type MIME particulier.

Bien que ce ne soit pas une réponse à votre question, cela résout le problème que vous essayez de résoudre. YMMV.

Comme vous l'avez écrit, le type mime n'est pas fiable, car chaque navigateur a le moyen de le déterminer. Cependant, les navigateurs envoient le nom d'origine (y compris l'extension) du fichier. La meilleure façon de traiter le problème consiste donc à inspecter l'extension du fichier au lieu du type MIME.

Si vous avez toujours besoin du type mime, vous pouvez utiliser le mime.types de votre propre apache pour le déterminer côté serveur.

Je suis d'accord avec johndodo, il y a tellement de variables qui rendent les types mime envoyés par les navigateurs peu fiables. Je voudrais exclure les sous-types qui sont reçus et me concentrer simplement sur le type comme «application». si votre application est basée sur php, vous pouvez facilement le faire en utilisant la fonction explode (). De plus, vérifiez l’extension du fichier pour vous assurer qu’il s’agit bien de .zip ou de toute autre compression que vous recherchez!

Selon rfc1867 - Chargement de fichier basé sur un formulaire au format HTML :

  

Chaque partie doit être étiquetée avec un type de contenu approprié si le   type de support est connu (par exemple, déduit de l’extension de fichier ou   type de système d’exploitation) ou en tant qu’application / octet-stream.

Si j'ai bien compris, application / octet-stream est un peu comme un identificateur général fourre-tout si le type ne peut pas être inféré . .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top