IE的MD5算法太慢了,何解?

bwangel 2016-12-02 09:20:36
使用文件上传组件,上传文件,想做到类似于网盘的秒传效果,让用户不至于重复上传一些大文件。

但是在检验文件的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();

};
...全文
521 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cooljser 2016-12-19
  • 打赏
  • 举报
回复
不用ie不就好了。
tcmakebest 2016-12-03
  • 打赏
  • 举报
回复
那就只能做一个客户端来上传了.
Go 旅城通票 2016-12-02
  • 打赏
  • 举报
回复
FileReader IE9-不支持,自己先去掉计算md5的代码,就测试FileReader的readAsArrayBuffer看时间,如果是readAsArrayBuffer有问题就不用想优化了,系统内置的函数。

如果不是readAsArrayBuffer的问题,自己检查这个插件的内部代码看有没有可以优化的地方了

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧