260 votes

Comment vérifier le type MIME d'un fichier avec javascript avant de le télécharger ?

J'ai lu este y este qui semble suggérer que le type MIME du fichier pourrait être vérifié en utilisant le javascript du côté client. Maintenant, je comprends que la véritable validation doit encore être effectuée côté serveur. Je veux effectuer une vérification côté client pour éviter de gaspiller inutilement les ressources du serveur.

Pour tester si cela peut être fait du côté client, j'ai modifié l'extension d'un fichier de type JPEG fichier de test vers .png et choisissez le fichier à télécharger. Avant d'envoyer le fichier, j'interroge l'objet fichier à l'aide d'une console javascript :

document.getElementsByTagName('input')[0].files[0];

Voici ce que j'obtiens sur Chrome 28.0 :

Fichier {webkitRelativePath : "", lastModifiedDate : Tue Oct 16 2012 10:00:00 GMT+0000 (UTC), nom : "test.png", type : "image/png", taille : 500055 }

Il montre le type à être image/png ce qui semble indiquer que la vérification est effectuée en fonction de l'extension du fichier et non du type MIME. J'ai essayé Firefox 22.0 et il me donne le même résultat. Mais selon la spécification du W3C , Reniflage de MIME doit être mis en œuvre.

Ai-je raison de dire qu'il n'y a aucun moyen de vérifier le type MIME avec javascript pour le moment ? Ou est-ce que quelque chose m'échappe ?

6 votes

I want to perform a client side checking to avoid unnecessary wastage of server resource. Je ne comprends pas pourquoi vous dites que la validation doit être effectuée du côté du serveur, mais dites ensuite que vous voulez réduire les ressources du serveur. Règle d'or : Ne jamais faire confiance aux données de l'utilisateur . Quel est l'intérêt de vérifier le type MIME du côté client si vous le faites ensuite du côté serveur. Il s'agit certainement d'un "gaspillage inutile de ressources". client ressource" ?

10 votes

Fournir une meilleure vérification du type de fichier/un meilleur retour d'information aux utilisateurs côté client est une bonne idée. Cependant, comme vous l'avez indiqué, les navigateurs se basent simplement sur les extensions de fichier pour déterminer la valeur de la propriété type propriété pour File objets. Le code source de webkit, par exemple, révèle cette vérité. Il est possible d'identifier avec précision les fichiers côté client en recherchant, entre autres, des "octets magiques" dans les fichiers. Je travaille actuellement sur une bibliothèque MIT (dans le peu de temps libre dont je dispose) qui fera exactement cela. Si vous êtes intéressé par mes progrès, jetez un coup d'œil à github.com/rnicholus/determinater .

54 votes

@IanClark, le fait est que si le fichier est d'un type non valide, je peux le rejeter du côté client plutôt que de gaspiller la bande passante de téléchargement pour ensuite le rejeter du côté serveur.

-2voto

Lex Points 539

La réponse courte est non.

Comme vous le notez, les navigateurs dérivent type de l'extension du fichier. La prévisualisation Mac semble également fonctionner à partir de l'extension. Je suppose que c'est parce que c'est plus rapide de lire le nom du fichier contenu dans le pointeur, plutôt que de chercher et lire le fichier sur le disque.

J'ai fait une copie d'un jpg renommé en png.

J'ai pu obtenir systématiquement ce qui suit à partir des deux images dans chrome (devrait fonctionner dans les navigateurs modernes).

ÿØÿàJFIFÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90

Vous pourriez utiliser String.indexOf('jpeg') pour vérifier le type d'image.

Voici un violon à explorer http://jsfiddle.net/bamboo/jkZ2v/1/

La ligne ambigüe que j'ai oublié de commenter dans l'exemple

console.log( /^(.*)$/m.exec(window.atob( image.src.split(',')[1] )) );

  • Divise les données img encodées en base64, en laissant l'image.
  • Décode l'image en base64
  • Correspond uniquement à la première ligne des données de l'image.

Le code du fiddle utilise le décodage base64 qui ne fonctionne pas dans IE9, j'ai trouvé un bel exemple utilisant VB script qui fonctionne dans IE http://blog.nihilogic.dk/2008/08/imageinfo-reading-image-metadata-with.html

Le code pour charger l'image provient de Joel Vardy, qui fait un redimensionnement cool de la toile d'image côté client avant le téléchargement, ce qui peut être intéressant. https://joelvardy.com/writing/javascript-image-upload

1 votes

Ne cherchez pas la sous-chaîne "jpeg" dans les JPEG, c'est juste une coïncidence que vous l'ayez trouvée dans un commentaire. Les fichiers JPEG ne sont pas obligés de la contenir (et si vous envisagez de rechercher JFIF à la place, eh bien APP0 ne doit pas contenir de JFIF dans les EXIF-JPEGs, ce qui n'est pas le cas non plus).

0 votes

Voir top "La réponse courte est non".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X