我是靠谱客的博主 任性帽子,这篇文章主要介绍WebUploader结合SparkMd5实现文件秒传秒传的实现原理js-spark-md5WebUploader查询文件是否存在计算Md5,现在分享给大家,希望可以做个参考。

秒传的实现原理

  文件秒传的实现原理其实就是在文件上传前,把内容读取出来,算出 md5 值,然后通过 ajax 与服务端进行验证, 然后根据结果选择继续上传还是跳过上传

js-spark-md5

  虽然百度的WebUploader也能够计算文件Md5,但我使用了之后发现效果不太理想。这时候就要使用其他方式来计算。js-spark-md5是号称全宇宙最快的前端类包,可以无需上传文件就快速获取本地文件md5。下载地址

WebUploader查询文件是否存在

  首先注册一个文件上传前的方法,通过ajax在文件上传前向后端查询该文件是否存在,得到一个布尔值的结果,如果为true则存在,否则不存在。

  在下面的代码中可以看到,我的做法是在文件添加到上传队列时就计算其Md5,calMd5是我自己封装的方法,在下面会提到。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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对象。至此,可以说文件秒传已经完成了。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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实现文件秒传秒传内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部