IE的MD5算法太慢了,何解?
使用文件上传组件,上传文件,想做到类似于网盘的秒传效果,让用户不至于重复上传一些大文件。
但是在检验文件的MD5的时候,由于IE端的效率问题,导致该方案基本无解。非IE的比IE的快两个数量级。
哪怕是最新的Edge也很快。就是IE慢。
扫描100M左右的文件,计算测试时间为:IE:148.75s,非IE 6.67s。当然计算出的MD5结果还是完全一样的。
md5的检测代码是这样的,用的是网上的spark.md5.js,
大神帮忙看看,到底是IE的错还是我的错?
封装的代码:
//此文件依赖于spart.md5.js
//计算本地文件的md5码
//file-本地文件名
// endcallback - function(md5) 计算完的回调, 参数就是得到的md5码
// pcallback - function(percent) 分片计算时,每一片计算完的回调,参数是一个小于1的百分数,通常用于进度条
$.sparkmd5 = function (file, endcallback, pcallback) {
var fileReader = new FileReader();
var box = document.getElementById("box");
//文件分割方法(注意兼容性)
blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice;
//文件每块分割2M,计算分割详情
chunkSize = 2097152;
chunks = Math.ceil(file.size / chunkSize);
currentChunk = 0;
//创建md5对象(基于SparkMD5)
var spark = new SparkMD5.ArrayBuffer();
//每块文件读取完毕之后的处理
fileReader.onload = function (e) {
console.log("读取文件", currentChunk + 1, "/", chunks);
pcallback && pcallback((currentChunk + 1) / chunks);
//每块交由sparkMD5进行计算
spark.append(e.target.result);
currentChunk++;
//如果文件处理完成计算MD5,如果还有分片继续处理
if (currentChunk < chunks) {
loadNext();
} else {
endcallback && endcallback(spark.end());
}
};
//处理单片文件的上传
function loadNext() {
var start = currentChunk * chunkSize;
var end = start + chunkSize >= file.size ? file.size : start + chunkSize;
fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
}
loadNext();
};