在实际开发过程中我们可能会遇到大文件上传的场景,在 node 中是如何实现的呢?如果还是采用将文件一次性读写到服务端,将非常耗时、耗内存,而且网络发生中断后又要重新上传,性能很低。那如何实现一个高性能的上传功能呢?本文将为您一一揭晓。
1、大文件上传的基本流程
- 前端对文件进行
MD5
加密,生成MD5
值,这个值是文件的唯一标识,可以用来校验文件的完整性。 - 发送请求校验文件的
MD5
值,检测文件是否上传,如果文件已经上传,则不用上传;如果文件上传了一部分,则把剩余文件块上传;如果没有上传过,则全部上传。 - 确定文件块大小,切分文件,并发调用上传接口,将文件块上传到服务端。
- 前端上传完文件分片后请求通知后端合并文件块,整合成初始文件。
2、生成文件 MD5 值
1、什么是 MD5?
MD5 信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。
2、怎样生成文件 MD5 值?
我是用 spark-md5.js
库生成文件 MD5
值。SparkMD5
是 MD5
算法的快速实现,非常适合浏览器使用,因为 nodejs
版本可能更快。
spark-md5.js
库 github
链接:https://github.com/satazor/js-spark-md5
官网告诉我们增量 MD5
在散列大型数据(文件)时表现更好,首先使用 FileReader
和Blob
以块的形式读取文件,将块追加到 MD5
散列中,最终会生成一个文件 MD5
值,同时生成过程保持了低内存使用率。
FileReader
对象允许 Web
应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File
或Blob
对象指定要读取的文件或数据。
FileReader
说明链接:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader
3、校验文件 MD5 值
MD5 值作为一个存放文件块的目录,检验 MD5 值即使检验该目录是否存在,如果存在,则文件已经完全上传或上传了一部分;如果不存在,则该文件没有被上传。
4、分片上传
5、服务端合并文件
源码参考 github
链接:
https://github.com/Revelation2019/node-
参考文章:
https://segmentfault.com/a/1190000008899001