乐趣区

node如何实现大文件上传

在实际开发过程中我们可能会遇到大文件上传的场景,在 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

3、校验文件 MD5 值

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

4、分片上传

5、服务端合并文件

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

退出移动版