Gibt es eine Möglichkeit, den MD5-Hash einer Datei vor dem Hochladen auf den Server mit Javascript zu berechnen?
javascript
md5
LuRsT
quelle
quelle
Antworten:
Während es JS-Implementierungen des MD5-Algorithmus gibt, können ältere Browser im Allgemeinen keine Dateien aus dem lokalen Dateisystem lesen .
Ich habe das 2009 geschrieben. Was ist also mit neuen Browsern?
Mit einem Browser, der die FileAPI unterstützt , können Sie den Inhalt einer Datei * lesen * - der Benutzer muss ihn entweder mit einem
<input>
Element oder per Drag & Drop ausgewählt haben. Ab Januar 2013 stapeln sich die wichtigsten Browser folgendermaßen:quelle
Ich habe eine Bibliothek erstellt, die inkrementelles md5 implementiert, um große Dateien effizient zu hashen. Grundsätzlich lesen Sie eine Datei in Blöcken (um den Speicher niedrig zu halten) und hashen sie schrittweise. Grundlegende Verwendung und Beispiele finden Sie in der Readme-Datei.
Beachten Sie, dass Sie HTML5 FileAPI benötigen. Überprüfen Sie dies daher unbedingt. Im Testordner befindet sich ein vollständiges Beispiel.
https://github.com/satazor/SparkMD5
quelle
.end()
Methode gibt. Wenn Sie diese Methode erneut aufrufen, führt dies beim nächsten Mal zu einem falschen Ergebnis. Da.end()
Anrufe.reset()
intern. Dies ist eine Codierungskatastrophe und nicht gut für das Schreiben von Bibliotheken.Es ist ziemlich einfach, den MD5-Hash mit der MD5-Funktion von CryptoJS und der HTML5 FileReader-API zu berechnen . Das folgende Codefragment zeigt, wie Sie die Binärdaten lesen und den MD5-Hash aus einem Bild berechnen können, das in Ihren Browser gezogen wurde:
Ich empfehle, CSS hinzuzufügen, um den Drag & Drop-Bereich anzuzeigen:
Weitere Informationen zur Drag & Drop-Funktionalität finden Sie hier: File API & FileReader
Ich habe das Beispiel in Google Chrome Version 32 getestet.
quelle
readAsBinaryString()
nicht standardisiert wurde und von Internet Explorer nicht unterstützt wird. Ich habe es nicht in Edge getestet, aber selbst IE11 unterstützt es nicht.readAsBinaryString()
: caniuse.com/#feat=filereader - Microsoft Edge unterstützt dies.readAsBinaryString()
da es von älteren Browsern nicht unterstützt wird. Eine Alternative, die ich gefunden habe, ist SparkMD5. Es wird auch die FileReader-API verwendetreadAsArrayBuffer
, jedoch die vom IE unterstützte Methode . Und es kann riesige Dateien verarbeiten, indem es sie in Stücken liest.CryptoJS.lib.WordArray.create(arrayBuffer);
HTML5 +
spark-md5
undQ
Angenommen, Sie verwenden einen modernen Browser (der die HTML5-Datei-API unterstützt). So berechnen Sie den MD5-Hash einer großen Datei (er berechnet den Hash für variable Chunks).
quelle
Sie müssen FileAPI verwenden. Es ist in der neuesten Version von FF & Chrome verfügbar, jedoch nicht in IE9. Besorgen Sie sich eine der oben vorgeschlagenen md5 JS-Implementierungen. Ich habe dies versucht und es aufgegeben, weil JS zu langsam war (Minuten bei großen Bilddateien). Könnte es erneut besuchen, wenn jemand MD5 mit typisierten Arrays neu schreibt.
Code würde ungefähr so aussehen:
quelle
reader
Variable zum Zeitpunkt der Ausführung der Onload-Funktionen die letzte Datei ist.CryptoJS.lib.WordArray.create(arrayBuffer);
Was in den meisten Fällen nutzlos ist. Sie möchten, dass der MD5 auf der Clientseite berechnet wird, damit Sie ihn mit dem auf der Serverseite neu berechneten Code vergleichen und feststellen können, dass der Upload fehlgeschlagen ist, wenn sie sich unterscheiden. Ich musste dies in Anwendungen tun, die mit großen Dateien wissenschaftlicher Daten arbeiten, bei denen der Empfang unbeschädigter Dateien der Schlüssel war. Meine Fälle waren einfach, da Benutzer den MD5 bereits aus ihren Datenanalysetools berechnet hatten, sodass ich ihn nur mit einem Textfeld fragen musste.
quelle
Um den Hash von Dateien zu erhalten, gibt es viele Optionen. Normalerweise ist das Problem, dass es sehr langsam ist, den Hash großer Dateien zu erhalten.
Ich habe eine kleine Bibliothek erstellt, die den Hash von Dateien abruft, mit den 64 KB am Anfang der Datei und den 64 KB am Ende der Datei.
Live-Beispiel: http://marcu87.github.com/hashme/ und Bibliothek: https://github.com/marcu87/hashme
quelle
Es gibt ein paar Skripte im Internet, um einen MD5-Hash zu erstellen.
Das von webtoolkit ist gut, http://www.webtoolkit.info/javascript-md5.html
Ich glaube jedoch nicht, dass es Zugriff auf das lokale Dateisystem haben wird, da dieser Zugriff begrenzt ist.
quelle
Ich hoffe, Sie haben inzwischen eine gute Lösung gefunden. Wenn nicht, ist die folgende Lösung eine ES6-Versprechen-Implementierung, die auf js-spark-md5 basiert
quelle
Das folgende Snippet zeigt ein Beispiel, mit dem ein Durchsatz von 400 MB / s beim Lesen und Hashing der Datei archiviert werden kann.
Es wird eine Bibliothek namens Hash-Wasm verwendet , die auf WebAssembly basiert und den Hash schneller berechnet als Nur-JS-Bibliotheken. Ab 2020 unterstützen alle modernen Browser WebAssembly.
quelle
Mit dem aktuellen HTML5 sollte es möglich sein, den md5-Hash einer Binärdatei zu berechnen. Ich denke jedoch, dass der vorherige Schritt darin besteht, die banalen Daten BlobBuilder in einen String zu konvertieren. Ich versuche diesen Schritt auszuführen: war aber nicht erfolgreich.
Hier ist der Code, den ich ausprobiert habe: Konvertieren eines BlobBuilder in einen String in HTML5-Javascript
quelle
Ich glaube nicht, dass es in Javascript eine Möglichkeit gibt, auf den Inhalt eines Datei-Uploads zuzugreifen. Sie können daher nicht auf den Dateiinhalt schauen, um eine MD5-Summe zu generieren.
Sie können die Datei jedoch an den Server senden, der dann eine MD5-Summe zurücksenden oder den Dateiinhalt zurücksenden kann. Aber das ist viel Arbeit und für Ihre Zwecke wahrscheinlich nicht lohnenswert.
quelle