Есть ли способ рассчитать хэш файла MD5 перед загрузкой на сервер с помощью Javascript?
javascript
md5
ЛюРст
источник
источник
Ответы:
Хотя существуют JS-реализации алгоритма MD5, старые браузеры обычно не могут читать файлы из локальной файловой системы .
Я написал это в 2009 году. А что насчет новых браузеров?
В браузере, поддерживающем FileAPI , вы * можете * читать содержимое файла - пользователь должен выбрать его с помощью
<input>
элемента или перетаскивания. По состоянию на январь 2013 года основные браузеры складываются следующим образом:источник
Я сделал библиотеку, которая реализует инкрементный md5 для эффективного хеширования больших файлов. В основном вы читаете файл по частям (чтобы сохранить мало памяти) и хешируете его постепенно. Вы ознакомились с основными принципами использования и примерами в файле readme.
Имейте в виду, что вам нужен HTML5 FileAPI, поэтому обязательно проверьте его. В тестовой папке есть полный пример.
https://github.com/satazor/SparkMD5
источник
.end()
методом. Если вы вызовете этот метод снова, в следующий раз он даст неправильный результат. Потому что.end()
звонит.reset()
внутренне. Это катастрофа с кодированием и не подходит для написания библиотеки.довольно легко вычислить хеш MD5, используя функцию MD5 CryptoJS и API HTML5 FileReader . В следующем фрагменте кода показано, как вы можете прочитать двоичные данные и вычислить хэш MD5 из изображения, которое было перетащено в ваш браузер:
Я рекомендую добавить CSS, чтобы увидеть область перетаскивания:
Подробнее о функциях перетаскивания можно найти здесь: File API & FileReader
Я тестировал образец в Google Chrome версии 32.
источник
readAsBinaryString()
он не стандартизирован и не поддерживается Internet Explorer. Я не тестировал его в Edge, но даже IE11 его не поддерживает.readAsBinaryString()
: caniuse.com/#feat=filereader - Microsoft Edge поддерживает.readAsBinaryString()
поскольку он не поддерживается старыми браузерами. Я нашел альтернативу SparkMD5. Он также использует API FileReader, но методreadAsArrayBuffer
, который поддерживается IE. И он может обрабатывать огромные файлы, читая их по частям.CryptoJS.lib.WordArray.create(arrayBuffer);
HTML5 +
spark-md5
иQ
Предполагая, что вы используете современный браузер (который поддерживает API файлов HTML5), вот как вы вычисляете хеш MD5 для большого файла (он будет вычислять хеш для переменных фрагментов)
источник
Вам необходимо использовать FileAPI. Он доступен в последних версиях FF и Chrome, но не в IE9. Возьмите любую реализацию md5 JS, предложенную выше. Я пробовал это и отказался от него, потому что JS был слишком медленным (минуты для больших файлов изображений). Могу вернуться к нему, если кто-то перепишет MD5, используя типизированные массивы.
Код будет выглядеть примерно так:
источник
reader
переменная будет последним файлом к моменту запуска функций onload.CryptoJS.lib.WordArray.create(arrayBuffer);
Что в большинстве случаев бесполезно. Вы хотите, чтобы MD5 вычислялся на стороне клиента, чтобы вы могли сравнить его с кодом, повторно вычисленным на стороне сервера, и сделать вывод, что загрузка пошла не так, если они отличаются. Мне приходилось делать это в приложениях, работающих с большими файлами научных данных, где получение неповрежденных файлов было ключевым моментом. Мои случаи были простыми, потому что у пользователей был MD5, уже вычисленный с помощью их инструментов анализа данных, поэтому мне просто нужно было спросить их с помощью текстового поля.
источник
Чтобы получить хэш файлов, существует множество вариантов. Обычно проблема в том, что получить хэш больших файлов очень медленно.
Я создал небольшую библиотеку, которая получает хэш файлов с 64 КБ в начале файла и 64 КБ в конце.
Живой пример: http://marcu87.github.com/hashme/ и библиотека: https://github.com/marcu87/hashme
источник
В Интернете есть пара скриптов для создания хеша MD5.
Хороший вариант от webtoolkit, http://www.webtoolkit.info/javascript-md5.html
Хотя я не верю, что у него будет доступ к локальной файловой системе, поскольку этот доступ ограничен.
источник
Надеюсь, вы уже нашли хорошее решение. Если нет, то решение ниже представляет собой реализацию обещания ES6 на основе js-spark-md5.
источник
В следующем фрагменте показан пример, который может архивировать пропускную способность 400 МБ / с при чтении и хешировании файла.
Он использует библиотеку под названием hash-wasm , которая основана на WebAssembly и вычисляет хэш быстрее, чем библиотеки только для js. По состоянию на 2020 год все современные браузеры поддерживают WebAssembly.
источник
С текущим HTML5 должно быть возможно вычислить хэш md5 двоичного файла, но я думаю, что предыдущим шагом было бы преобразование банарных данных BlobBuilder в строку, я пытаюсь сделать этот шаг: но безуспешно.
Вот код, который я пробовал: преобразование BlobBuilder в строку в HTML5 Javascript
источник
Я не верю, что в javascript есть способ получить доступ к содержимому загружаемого файла. Таким образом, вы не можете просматривать содержимое файла для генерации суммы MD5.
Однако вы можете отправить файл на сервер, который затем может отправить обратно сумму MD5 или отправить обратно содержимое файла ... но это большая работа и, вероятно, не стоит для ваших целей.
источник