Existe-t-il un moyen de calculer le hachage MD5 d'un fichier avant le téléchargement sur le serveur en utilisant Javascript?
javascript
md5
LuRsT
la source
la source
Réponses:
Bien qu'il existe des implémentations JS de l'algorithme MD5, les anciens navigateurs sont généralement incapables de lire les fichiers à partir du système de fichiers local .
J'ai écrit ça en 2009. Alors qu'en est-il des nouveaux navigateurs?
Avec un navigateur qui prend en charge FileAPI , vous * pouvez * lire le contenu d'un fichier - l'utilisateur doit l'avoir sélectionné, soit avec un
<input>
élément , soit par glisser-déposer. Depuis janvier 2013, voici comment les principaux navigateurs s'empilent:la source
J'ai créé une bibliothèque qui implémente md5 incrémentiel afin de hacher efficacement de gros fichiers. En gros, vous lisez un fichier par morceaux (pour garder la mémoire faible) et le hachez de manière incrémentielle. Vous avez une utilisation de base et des exemples dans le readme.
Sachez que vous avez besoin de HTML5 FileAPI, alors assurez-vous de le vérifier. Il y a un exemple complet dans le dossier de test.
https://github.com/satazor/SparkMD5
la source
.end()
méthode. Si vous appelez à nouveau cette méthode, cela donne un résultat erroné les fois suivantes. Parce que les.end()
appels en.reset()
interne. C'est un désastre de codage et pas bon pour l'écriture de bibliothèque.il est assez facile de calculer le hachage MD5 en utilisant la fonction MD5 de CryptoJS et l' API HTML5 FileReader . L'extrait de code suivant montre comment vous pouvez lire les données binaires et calculer le hachage MD5 à partir d'une image qui a été glissée dans votre navigateur:
Je recommande d'ajouter du CSS pour voir la zone Drag & Drop:
Pour en savoir plus sur la fonctionnalité Drag & Drop, cliquez ici: File API & FileReader
J'ai testé l'exemple dans Google Chrome version 32.
la source
readAsBinaryString()
n'a pas été normalisé et n'est pas pris en charge par Internet Explorer. Je ne l'ai pas testé dans Edge, mais même IE11 ne le prend pas en charge.readAsBinaryString()
: caniuse.com/#feat=filereader - Microsoft Edge le prend en charge.readAsBinaryString()
car il n'est pas pris en charge par les navigateurs plus anciens. Une alternative que j'ai trouvée est SparkMD5. Il utilise également l'API FileReader mais la méthodereadAsArrayBuffer
, qui est prise en charge par IE. Et il peut gérer d'énormes fichiers en les lisant en morceaux.CryptoJS.lib.WordArray.create(arrayBuffer);
HTML5 +
spark-md5
etQ
En supposant que vous utilisez un navigateur moderne (qui prend en charge l'API de fichier HTML5), voici comment calculer le hachage MD5 d'un gros fichier (il calculera le hachage sur des blocs variables)
la source
Vous devez utiliser FileAPI. Il est disponible dans les derniers FF et Chrome, mais pas dans IE9. Prenez n'importe quelle implémentation md5 JS suggérée ci-dessus. J'ai essayé et abandonné parce que JS était trop lent (minutes sur de gros fichiers image). Pourrait le revoir si quelqu'un réécrit MD5 en utilisant des tableaux typés.
Le code ressemblerait à ceci:
la source
reader
variable sera le dernier fichier au moment où les fonctions de chargement sont exécutées.CryptoJS.lib.WordArray.create(arrayBuffer);
Ce qui est inutile dans la plupart des cas. Vous voulez que le MD5 soit calculé côté client, afin de pouvoir le comparer avec le code recalculé côté serveur et conclure que le téléchargement s'est mal passé s'ils diffèrent. J'ai eu besoin de le faire dans des applications fonctionnant avec de gros fichiers de données scientifiques, où la réception de fichiers non corrompus était la clé. Mes cas étaient simples, car les utilisateurs avaient déjà le MD5 calculé à partir de leurs outils d'analyse de données, alors j'avais juste besoin de le leur demander avec un champ de texte.
la source
Pour obtenir le hachage des fichiers, il existe de nombreuses options. Normalement, le problème est qu'il est très lent d'obtenir le hachage de gros fichiers.
J'ai créé une petite bibliothèque qui récupère le hachage des fichiers, avec les 64kb du début du fichier et les 64kb de la fin.
Exemple en direct: http://marcu87.github.com/hashme/ et bibliothèque: https://github.com/marcu87/hashme
la source
Il existe quelques scripts sur Internet pour créer un hachage MD5.
Celui de webtoolkit est bon, http://www.webtoolkit.info/javascript-md5.html
Cependant, je ne pense pas qu'il aura accès au système de fichiers local car cet accès est limité.
la source
j'espère que vous avez trouvé une bonne solution maintenant. Sinon, la solution ci-dessous est une implémentation de promesse ES6 basée sur js-spark-md5
la source
L'extrait de code suivant montre un exemple, qui peut archiver un débit de 400 Mo / s lors de la lecture et du hachage du fichier.
Il utilise une bibliothèque appelée hash-wasm , qui est basée sur WebAssembly et calcule le hachage plus rapidement que les bibliothèques js uniquement. À partir de 2020, tous les navigateurs modernes prennent en charge WebAssembly.
la source
Avec HTML5 actuel, il devrait être possible de calculer le hachage md5 d'un fichier binaire, mais je pense que l'étape précédente serait de convertir les données banary BlobBuilder en chaîne, j'essaie de faire cette étape: mais je n'ai pas réussi.
Voici le code que j'ai essayé: Conversion d'un BlobBuilder en string, en HTML5 Javascript
la source
Je ne crois pas qu'il existe un moyen en javascript d'accéder au contenu d'un téléchargement de fichier. Vous ne pouvez donc pas regarder le contenu du fichier pour générer une somme MD5.
Vous pouvez cependant envoyer le fichier au serveur, qui peut alors renvoyer une somme MD5 ou renvoyer le contenu du fichier .. mais c'est beaucoup de travail et probablement pas utile pour vos besoins.
la source