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讀取文件二進制碼
};
複製代碼
接下上第二種方法:
html
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();
}
複製代碼