大文件上传前台分片后后台合并的问题

2021-03-12 20:27

阅读:746

  为什么说流更好呢?流到底是什么呢?

  流是数据的集合 —— 就像数组或字符串一样。区别在于流中的数据可能不会立刻就全部可用,并且你无需一次性的把这些数据全部放入内存。这使得流在操作大量数据或是数据从外部来源逐段发送过来的时候变得非常有用。

  换句话说,当你使用buffer方式来处理一个2GB的文件,占用的内存可能是2GB以上,而当你使用流来处理这个文件,可能只会占用几十个M。这就是我们为什么选择流的原因所在。

  在Node.js中,有4种基本类型的流,分别是可读流,可写流,双向流以及变换流。

  • 可读流是对一个可以读取数据的源的抽象。fs.createReadStream 方法是一个可读流的例子。
  • 可写流是对一个可以写入数据的目标的抽象。fs.createWriteStream 方法是一个可写流的例子。
  • 双向流既是可读的,又是可写的。TCP socket 就属于这种。
  • 变换流是一种特殊的双向流,它会基于写入的数据生成可供读取的数据。

  所有的流都是EventEmitter的实例。它们发出可用于读取或写入数据的事件。然而,我们可以利用pipe方法以一种更简单的方式使用流中的数据。

  在上面那段代码中,我们首先通过fs.createWriteStream()创建了一个可写流,用来存放最终合并的文件。然后使用fs.createReadStream()分别读取各个分片后的文件,再通过pipe()方式将读取的数据像倒水一样“倒”到可写流中,到监控到一杯水倒完后,马上接着倒下一杯,直到全部倒完为止。此时,全部文件合并完毕。

3、追加文件方式合并

  追加文件方式合并指的是使用fs.appendFile()的方式来进行合并。

  fs.appendFile()的作用是异步地追加数据到一个文件,如果文件不存在则创建文件。data可以是一个字符串或buffer。

  使用这种方法也可以将文件合并,性能强过buffer合并方式,但不及流合并方式。

  三种方式各有各的特点,但是在大文件合并上,我推荐使用流方式合并,流合并占内存最少,效率最高,是处理大文件的最佳选择。


评论


亲,登录后才可以留言!