задний план:
Говоря о том, что я впервые использовал spark-md5.js, это было почти год назад, тогда начальник на заднем плане сказал, что хочет разработать функцию загрузки файлов. Я подумал про себя: что? Что такое загрузка файла в несколько частей, вы никогда не слышали об этом?
Что касается паники в душе в тот момент, то описывать особо не буду, короче для загрузки файла нужен уникальный идентификатор для идентификации файла, и md5 очень подходит. spark-md5.js — очень надежное решение для внешнего интерфейса для локального вычисления md5 перед загрузкой файлов.
spark-md5.js написан иностранцами.Если у вас хороший английский язык и вы хотите узнать больше информации, вы можете перейти на веб-сайт npm, чтобы узнать:Уууу, эта лошадь плюс .com/package/ из-за страха перед…
использовать:
Первое, что нужно сделать, это, конечно же, ввести spark-md5.js в html-файл.Вы можете ввести сжатую версию или версию для разработки в соответствии с вашими потребностями.
Перед этим необходимо объяснить, что здесь используется интерфейс FileReader, предоставляемый html5.В настоящее время браузеры, реализующие этот интерфейс, включают FireFox3.6+, chrome6+ и IE10+, поэтому, если вам нужна дополнительная совместимость, извините, я не еще не нашел хороший метод.
Что касается FileReader, вот высококачественный пост в блоге, о котором можно узнать:blog.CSDN.net/Джек положил Эд/Ах…
Здесь предусмотрены два метода: первый — использовать SparkMD5.hashBinary() для прямой передачи двоичного кода всего файла в md5, который напрямую возвращает файл.Этот метод имеет преимущества для небольших файлов — он прост и быстр.
Другой метод заключается в использовании метода slice() объекта File в js (File.prototype.slice()) для нарезки файлов и передачи их методу spark.appendBinary() один за другим для вычисления и, наконец, вывода через метод spark.end() В результате становится ясно, что этот подход может быть очень полезен для больших файлов — он менее подвержен ошибкам и может предоставить информацию о ходе выполнения вычислений.
Начнем, перейдем к коду:
Сначала первый метод:
var running = false; //running用于判断是否正在计算md5
function doNormalTest( input ) { //这里假设直接将文件选择框的dom引用传入
if (running) { // 如果正在计算、不允许开始下一次计算
return;
}
var fileReader = new FileReader(), //创建FileReader实例
time;
fileReader.onload = function (e) { //FileReader的load事件,当文件读取完毕时触发
running = false;
// e.target指向上面的fileReader实例
if (file.size != e.target.result.length) { //如果两者不一致说明读取出错
alert("ERROR:Browser reported success but could not read the file until the end.");
} else {
console.log(Finished loading!success!!);
return SparkMD5.hashBinary(e.target.result); //计算md5并返回结果
}
};
fileReader.onerror = function () { //如果读取文件出错,取消读取状态并弹框报错
running = false;
alert("ERROR:FileReader onerror was triggered, maybe the browser aborted due to high memory usage.");
};
running = true;
fileReader.readAsBinaryString( input.files[0] ); //通过fileReader读取文件二进制码
};
Переходим ко второму способу:
function doIncrementalTest( input ) { //这里假设直接将文件选择框的dom引用传入
if (running) {
return;
}
//这里需要用到File的slice( )方法,以下是兼容写法
var blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice,
file = input.files[0],
chunkSize = 2097152, // 以每片2MB大小来逐次读取
chunks = Math.ceil(file.size / chunkSize),
currentChunk = 0,
spark = new SparkMD5(), //创建SparkMD5的实例
time,
fileReader = new FileReader();
fileReader.onload = function (e) {
console("Read chunk number (currentChunk + 1) of chunks ");
spark.appendBinary(e.target.result); // append array buffer
currentChunk += 1;
if (currentChunk < chunks) {
loadNext();
} else {
running = false;
console.log("Finished loading!");
return spark.end(); // 完成计算,返回结果
}
};
fileReader.onerror = function () {
running = false;
console.log("something went wrong");
};
function loadNext() {
var start = currentChunk * chunkSize,
end = start + chunkSize >= file.size ? file.size : start + chunkSize;
fileReader.readAsBinaryString(blobSlice.call(file, start, end));
}
running = true;
loadNext();
}
Затем вам нужно только вызвать метод doNormalTest или doIncrementalTest в обработчике события onchange входа и передать узел dom элемента ввода.
Кроме того, у автора также есть подробные примеры использования в его демонстрации. Если вы не понимаете, вы можете загрузить его напрямую с помощью следующего метода загрузки и посмотреть демоверсию.
скачать:
Наконец, если вам нужен этот инструмент, вы можете установить его напрямую через npm,
npm i spark-md5
Или скачайте прямо с гитхаба автора: