当前位置: 首页 > 后端技术 > Node.js

Node+H5实现大文件分片上传(附源码)

时间:2023-04-03 18:00:15 Node.js

说之前上传大文件的教程网上有很多,但是大部分都没有给出比较完整的。本篇博客给出了一套完整的前后端解决方案。前端没有使用第三方上传库。希望能帮到有相同需求的朋友。大文件分段上传的好处这里就不用多说了。以前无论是上传单个文件还是分片上传,都是基于Flash。现在H5已经可以原生支持了,性能需要比Flash高很多,所以刚好公司有一个需求就是分片上传,分享一下分片上传的思路as如下:第一步:先对文件进行MD5加密,这样做有两个好处,一是可以对文件进行唯一标识,为即时传输做准备,二是可以在后台验证文件的完整性,进行比对.第二步:拿到MD5值后,需要检查文件是否上传过,如果上传过,就不需要再次上传,即可以秒传。网盘中的即时传输原理同上。第三步:切片文件。如果文件是500M,我们定义一个分片的大小为50M,那么整个文件分成100份上传。第四步:向后台请求接口。界面中的数据为文件中已经上传的文件块。为什么会有这样的要求?我们经常使用网盘,网盘中有续传的功能,一个文件上传到一半,由于各种原因,不想再上传,那么再次上传时,服务器应该保持我之前上传的文件块,跳过这些上传的块,重新上传其他文件块,当然还有很多恢复上传的选项。目前,单独发送请求效率最高。第五步:开始POST上传还没有上传的块。第六步:上传成功后通知服务器合并文件,至此上传完成!为了直观,我画了流程图,最终前端的效果图,后端最终的文件目录结构。我们来谈谈主要代码。GIF图片中的验证文件就是对文件进行MD5+,得到MD5值,看文件是否已经上传。小的MD5文件还可以,但是大的文件会慢一些。根据我的测试,一个4G的文件MD5时间大概是2分钟左右。对文件进行MD5,我们使用spark-md5,因为这一步是浏览器完成的,所以需要引入这个js,因为MD5文件大,耗时长,所以必须做成gif这样的进度条图片,这样文件需要进行MD5分片,spark也支持这种方法,最终的MD5值为spark.end()服务端验证文件的ajax请求需要传递文件名和MD5值文件,Node端会处理处理两个事件,1.检查文件是否存在。2.如果文件不存在,返回上传文件块列表。如果文件尚未上传,列表将为空。接下来我们对文件进行切片(File的API提供了切片操作),序号0-n,(服务器存储的文件格式也是MD5为文件夹名,0-n为文件名,如服务器所示上面的结果),然后循环每个片段,和上面服务器返回的List进行对比,上传不在列表中的文件。前端代码:节点端代码的最后一步。上传所有文件后,告诉Node合并文件。