概述
秒传的实现原理
文件秒传的实现原理其实就是在文件上传前,把内容读取出来,算出 md5 值,然后通过 ajax 与服务端进行验证, 然后根据结果选择继续上传还是跳过上传
js-spark-md5
虽然百度的WebUploader也能够计算文件Md5,但我使用了之后发现效果不太理想。这时候就要使用其他方式来计算。js-spark-md5是号称全宇宙最快的前端类包,可以无需上传文件就快速获取本地文件md5。下载地址
WebUploader查询文件是否存在
首先注册一个文件上传前的方法,通过ajax在文件上传前向后端查询该文件是否存在,得到一个布尔值的结果,如果为true则存在,否则不存在。
在下面的代码中可以看到,我的做法是在文件添加到上传队列时就计算其Md5,calMd5是我自己封装的方法,在下面会提到。
WebUploader.Uploader.register({
"before-send-file": "beforeSendFile",//整个文件上传前
}, {
beforeSendFile: function (file) {
$.ajax({
type: "POST",
url: "/checkFileExist",
data: {
md5: file.fileMd5
},
dataType: "json",
success: function (result) {
if (result) {
//文件存在,跳过
deferred.reject();
} else {
//文件不存在,准备上传
deferred.resolve();
}
},
error: function () {
deferred.resolve();
}
});
}
});
uploader.on('fileQueued', function (file) {
$list.append('<div id="' + file.id + '" class="item">' +
'<h4 class="info">' + file.name + '</h4>' +
'<p class="state">等待上传...</p>' +
'</div>');
calMd5(file).then(md5 => {
file.fileMd5 = md5;
});
});
计算Md5
在上面的下载地址中有一些Demo,但那是针对原生html的,无法与WebUploader结合起来,这时候就要对官方Demo的方法做一些修改,修改后的方法如下面的代码所示。
我在上网查阅资料后发现slice方法是针对blob对象,但WebUploader在传给方法的file对象是一个Object类型对象,那么很显然需要进行转化。在费劲一番心思后终于发现可以通过file.source.getSource()的方式转为blob对象。至此,可以说文件秒传已经完成了。
function calMd5(file) {
return new Promise((resolve, reject) => {
let chunkSize = 2097152,
// Read in chunks of 2MB
chunks = Math.ceil(file.size / chunkSize),
currentChunk = 0,
spark = new SparkMD5.ArrayBuffer(),
fileReader = new FileReader();
fileReader.onload = function (e) {
console.log('read chunk nr', currentChunk + 1, 'of', chunks);
spark.append(e.target.result);
// Append array buffer
currentChunk++;
if (currentChunk < chunks) {
loadNext();
} else {
console.log('finished loading');
let md5 = spark.end();
console.info('computed hash', md5);
// Compute hash
resolve(md5);
}
};
fileReader.onerror = function (e) {
console.warn('oops, something went wrong.');
reject(e);
};
function loadNext() {
let start = currentChunk * chunkSize,
end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;
fileReader.readAsArrayBuffer(blobSlice(file.source.getSource(), start, end));
}
loadNext();
});
}
function blobSlice(blob, startByte, endByte) {
if (blob.slice) {
return blob.slice(startByte, endByte);
}
// 兼容firefox
if (blob.mozSlice) {
return blob.mozSlice(startByte, endByte);
}
// 兼容webkit
if (blob.webkitSlice) {
return blob.webkitSlice(startByte, endByte);
}
return null;
}
最后
以上就是任性帽子为你收集整理的WebUploader结合SparkMd5实现文件秒传秒传的实现原理js-spark-md5WebUploader查询文件是否存在计算Md5的全部内容,希望文章能够帮你解决WebUploader结合SparkMd5实现文件秒传秒传的实现原理js-spark-md5WebUploader查询文件是否存在计算Md5所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复