10
在实际开发过程中我们可能会遇到大文件上传的场景,在node中是如何实现的呢?如果还是采用将文件一次性读写到服务端,将非常耗时、耗内存,而且网络发生中断后又要重新上传,性能很低。那如何实现一个高性能的上传功能呢?本文将为您一一揭晓。

1、大文件上传的基本流程

  1. 前端对文件进行MD5加密,生成MD5值,这个值是文件的唯一标识,可以用来校验文件的完整性。
  2. 发送请求校验文件的MD5值,检测文件是否上传,如果文件已经上传,则不用上传;如果文件上传了一部分,则把剩余文件块上传;如果没有上传过,则全部上传。
  3. 确定文件块大小,切分文件,并发调用上传接口,将文件块上传到服务端。
  4. 前端上传完文件分片后请求通知后端合并文件块,整合成初始文件。

2、生成文件MD5值

1、什么是MD5?

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

2、怎样生成文件MD5值?
我是用spark-md5.js库生成文件MD5值。SparkMD5MD5算法的快速实现,非常适合浏览器使用,因为nodejs版本可能更快。

spark-md5.jsgithub链接:https://github.com/satazor/js-spark-md5

官网告诉我们增量MD5在散列大型数据(文件)时表现更好,首先使用FileReaderBlob以块的形式读取文件,将块追加到MD5散列中,最终会生成一个文件MD5值,同时生成过程保持了低内存使用率。

FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用FileBlob对象指定要读取的文件或数据。

FileReader说明链接:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

code5.png

3、校验文件MD5值

MD5值作为一个存放文件块的目录,检验MD5值即使检验该目录是否存在,如果存在,则文件已经完全上传或上传了一部分;如果不存在,则该文件没有被上传。
code6.png

code7.png

code8.png

code9.png

4、分片上传

code10.png

code11.png

5、服务端合并文件

code12.png

code13.png

源码参考github链接:
https://github.com/Revelation2019/node-
参考文章:
https://segmentfault.com/a/1190000008899001


记得要微笑
1.9k 声望4.5k 粉丝

知不足而奋进,望远山而前行,卯足劲,不减热爱。