¿Hay alguna forma de calcular el hash MD5 de un archivo antes de subirlo al servidor usando Javascript?
javascript
md5
LuRsT
fuente
fuente
Respuestas:
Si bien hay implementaciones JS del algoritmo MD5, los navegadores más antiguos generalmente no pueden leer archivos del sistema de archivos local .
Lo escribí en 2009. ¿Qué pasa con los nuevos navegadores?
Con un navegador que admita FileAPI , * puede * leer el contenido de un archivo ; el usuario debe haberlo seleccionado, ya sea con un
<input>
elemento o arrastrando y soltando. A partir de enero de 2013, así es como se comparan los principales navegadores:fuente
Hice una biblioteca que implementa md5 incremental para procesar archivos grandes de manera eficiente. Básicamente, lee un archivo en trozos (para mantener baja la memoria) y lo hash de forma incremental. Tienes usos básicos y ejemplos en el archivo Léame.
Tenga en cuenta que necesita HTML5 FileAPI, así que asegúrese de verificarlo. Hay un ejemplo completo en la carpeta de prueba.
https://github.com/satazor/SparkMD5
fuente
.end()
método. Si vuelve a llamar a este método, las próximas veces dará un resultado incorrecto. Porque.end()
llama.reset()
internamente. Este es un desastre de codificación y no es bueno para la escritura de bibliotecas.Es bastante fácil calcular el hash MD5 utilizando la función MD5 de CryptoJS y la API FileReader de HTML5 . El siguiente fragmento de código muestra cómo puede leer los datos binarios y calcular el hash MD5 a partir de una imagen que se ha arrastrado a su navegador:
Recomiendo agregar algo de CSS para ver el área de arrastrar y soltar:
Puede encontrar más información sobre la funcionalidad de arrastrar y soltar aquí: API de archivos y lector de archivos
Probé la muestra en Google Chrome versión 32.
fuente
readAsBinaryString()
no se ha estandarizado y no es compatible con Internet Explorer. No lo probé en Edge, pero incluso IE11 no lo admite.readAsBinaryString()
: caniuse.com/#feat=filereader - Microsoft Edge lo admite.readAsBinaryString()
ya que no es compatible con los navegadores más antiguos. Una alternativa que encontré es SparkMD5. También utiliza la API FileReader, pero el métodoreadAsArrayBuffer
, que es compatible con IE. Y puede manejar archivos enormes leyéndolos en trozos.CryptoJS.lib.WordArray.create(arrayBuffer);
HTML5 +
spark-md5
yQ
Suponiendo que está utilizando un navegador moderno (que admite la API de archivos HTML5), así es como calcula el Hash MD5 de un archivo grande (calculará el hash en fragmentos variables)
fuente
Necesita usar FileAPI. Está disponible en la última versión de FF y Chrome, pero no en IE9. Coge cualquier implementación JS de md5 sugerida anteriormente. Probé esto y lo abandoné porque JS era demasiado lento (minutos en archivos de imagen grandes). Podría volver a visitarlo si alguien reescribe MD5 usando matrices escritas.
El código se vería así:
fuente
reader
variable será el último archivo cuando se ejecuten las funciones de onload.CryptoJS.lib.WordArray.create(arrayBuffer);
Lo cual es inútil en la mayoría de los casos. Desea que el MD5 se calcule en el lado del cliente, de modo que pueda compararlo con el código recalculado en el lado del servidor y concluir que la carga salió mal si difieren. Necesitaba hacer eso en aplicaciones que trabajaban con grandes archivos de datos científicos, donde recibir archivos no corrompidos era clave. Mis casos eran simples, porque los usuarios ya tenían el MD5 calculado a partir de sus herramientas de análisis de datos, por lo que solo necesitaba preguntárselo con un campo de texto.
fuente
Para obtener el hash de los archivos, hay muchas opciones. Normalmente, el problema es que es muy lento obtener el hash de archivos grandes.
Creé una pequeña biblioteca que obtiene el hash de los archivos, con los 64kb del inicio del archivo y los 64kb del final.
Ejemplo en vivo: http://marcu87.github.com/hashme/ y biblioteca: https://github.com/marcu87/hashme
fuente
Hay un par de scripts en Internet para crear un MD5 Hash.
El de webtoolkit es bueno, http://www.webtoolkit.info/javascript-md5.html
Aunque, no creo que tenga acceso al sistema de archivos local ya que ese acceso es limitado.
fuente
Espero que ya haya encontrado una buena solución. De lo contrario, la siguiente solución es una implementación de promesa ES6 basada en js-spark-md5
fuente
El siguiente fragmento muestra un ejemplo, que puede archivar un rendimiento de 400 MB / s mientras lee y procesa el archivo.
Utiliza una biblioteca llamada hash-wasm , que se basa en WebAssembly y calcula el hash más rápido que las bibliotecas solo js. A partir de 2020, todos los navegadores modernos admiten WebAssembly.
fuente
Con HTML5 actual debería ser posible calcular el hash md5 de un archivo binario, pero creo que el paso anterior sería convertir los datos banarios BlobBuilder en una cadena, estoy tratando de hacer este paso: pero no he tenido éxito.
Aquí está el código que probé: Convertir un BlobBuilder en cadena, en HTML5 Javascript
fuente
No creo que haya una forma en JavaScript para acceder al contenido de la carga de un archivo. Por lo tanto, no puede mirar el contenido del archivo para generar una suma MD5.
Sin embargo, puede enviar el archivo al servidor, que luego puede enviar una suma MD5 o devolver el contenido del archivo ... pero eso es mucho trabajo y probablemente no valga la pena para sus propósitos.
fuente