Existe uma maneira de calcular o hash MD5 de um arquivo antes do upload para o servidor usando Javascript?
javascript
md5
LuRsT
fonte
fonte
Respostas:
Embora existam implementações JS do algoritmo MD5, os navegadores mais antigos geralmente são incapazes de ler arquivos do sistema de arquivos local .
Eu escrevi isso em 2009. E quanto aos novos navegadores?
Com um navegador que suporta FileAPI , você * pode * ler o conteúdo de um arquivo - o usuário deve selecioná-lo, seja com um
<input>
elemento ou arrastar e soltar. Desde janeiro de 2013, veja como os principais navegadores se comparam:fonte
Eu fiz uma biblioteca que implementa md5 incremental para fazer o hash de arquivos grandes com eficiência. Basicamente, você lê um arquivo em partes (para manter a memória baixa) e faz o hash incrementalmente. Você tem uso básico e exemplos no leiame.
Esteja ciente de que você precisa de HTML5 FileAPI, portanto, certifique-se de verificá-lo. Há um exemplo completo na pasta de teste.
https://github.com/satazor/SparkMD5
fonte
.end()
método. Se você chamar esse método novamente, ele dará um resultado errado nas próximas vezes. Porque.end()
liga.reset()
internamente. Este é um desastre de codificação e não é bom para escrever em bibliotecas.é muito fácil calcular o hash MD5 usando a função MD5 do CryptoJS e a API FileReader HTML5 . O seguinte snippet de código mostra como você pode ler os dados binários e calcular o hash MD5 de uma imagem que foi arrastada para o seu navegador:
Eu recomendo adicionar algum CSS para ver a área Arrastar e Soltar:
Mais sobre a funcionalidade Arrastar e Soltar pode ser encontrado aqui: API de Arquivo e Leitor de Arquivos
Testei a amostra no Google Chrome versão 32.
fonte
readAsBinaryString()
isso não foi padronizado e não é compatível com o Internet Explorer. Não testei no Edge, mas mesmo o IE11 não oferece suporte.readAsBinaryString()
: caniuse.com/#feat=filereader - Microsoft Edge oferece suporte.readAsBinaryString()
lo, pois não é compatível com navegadores mais antigos. Uma alternativa que encontrei é SparkMD5. Ele também usa a API FileReader, mas o métodoreadAsArrayBuffer
, que é compatível com o IE. E pode lidar com arquivos enormes, lendo-os em partes.CryptoJS.lib.WordArray.create(arrayBuffer);
HTML5 +
spark-md5
eQ
Supondo que você esteja usando um navegador moderno (compatível com API de arquivo HTML5), veja como calcular o Hash MD5 de um arquivo grande (ele calculará o hash em pedaços variáveis)
fonte
Você precisa usar o FileAPI. Ele está disponível no FF e Chrome mais recente, mas não no IE9. Pegue qualquer implementação JS md5 sugerida acima. Eu tentei isso e abandonei porque JS era muito lento (minutos em arquivos de imagem grandes). Pode ser revisitado se alguém reescrever MD5 usando matrizes digitadas.
O código seria mais ou menos assim:
fonte
reader
variável será o último arquivo no momento em que as funções de onload forem executadas.CryptoJS.lib.WordArray.create(arrayBuffer);
O que é inútil na maioria dos casos. Você deseja que o MD5 seja calculado no lado do cliente, para que possa compará-lo com o código recomputado no lado do servidor e concluir que o upload deu errado se eles forem diferentes. Precisei fazer isso em aplicativos que trabalham com grandes arquivos de dados científicos, em que o recebimento de arquivos não corrompidos era fundamental. Meus casos eram simples, porque os usuários já tinham o MD5 computado a partir de suas ferramentas de análise de dados, então eu só precisava perguntar a eles com um campo de texto.
fonte
Para obter o hash de arquivos, existem várias opções. Normalmente, o problema é que é muito lento obter o hash de arquivos grandes.
Criei uma pequena biblioteca que pega o hash dos arquivos, com os 64kb do início do arquivo e os 64kb do final dele.
Exemplo ao vivo: http://marcu87.github.com/hashme/ e biblioteca: https://github.com/marcu87/hashme
fonte
Existem alguns scripts na Internet para criar um Hash MD5.
O do webtoolkit é bom, http://www.webtoolkit.info/javascript-md5.html
No entanto, não acredito que ele terá acesso ao sistema de arquivos local, pois esse acesso é limitado.
fonte
espero que você tenha encontrado uma boa solução até agora. Caso contrário, a solução abaixo é uma implementação de promessa ES6 baseada em js-spark-md5
fonte
O fragmento a seguir mostra um exemplo, que pode arquivar uma taxa de transferência de 400 MB / s durante a leitura e hash do arquivo.
Ele está usando uma biblioteca chamada hash-wasm , que é baseada no WebAssembly e calcula o hash mais rápido do que as bibliotecas somente js. A partir de 2020, todos os navegadores modernos suportam WebAssembly.
fonte
Com o HTML5 atual, deve ser possível calcular o hash md5 de um arquivo binário, mas acho que a etapa anterior seria converter os dados banários do BlobBuilder em uma String, estou tentando fazer esta etapa: mas não tive sucesso.
Aqui está o código que experimentei: Converter um BlobBuilder em string, em JavaScript HTML5
fonte
Não acredito que haja uma maneira em javascript de acessar o conteúdo de um upload de arquivo. Portanto, você não pode olhar o conteúdo do arquivo para gerar uma soma MD5.
No entanto, você pode enviar o arquivo para o servidor, que pode então enviar uma quantia MD5 de volta ou enviar o conteúdo do arquivo de volta ... mas isso é muito trabalhoso e provavelmente não vale a pena para seus propósitos.
fonte