如何将文件拆分为多个部分,将这些部分写入磁盘并使用节点js流将它们连接起来?

时间:2016-05-02 13:42:01

标签: node.js stream

我的目标是创建一个用于使用multiple下载的节点脚本 连接。所以,我打算用范围标题创建一个多个请求, 将响应流传递给多个部分,然后加入所有部分 当每个连接完成下载时,进入单个文件。

我不确定如何加入这些文件部分。为了确保,我尝试写 一半的文件并用它写下来:

const fs      = require('fs');

const input   = 'video.mp4';
const output1 = 'video.mp4.part1';

const half    = fs.statSync(input).size / 2;

const rstream = fs.createReadStream(input);
const part1 = fs.createWriteStream(output1);

part1
  .write(rstream.read(half));

但是,发生了一个错误:

TypeError: May not write null values to stream

我想这是因为文件没有正确结束。那么,怎么做呢 (正确拆分并加入文件)?

2 个答案:

答案 0 :(得分:2)

您可以通过提供选项

{start , end}
来指定您创建的可读流的边界。这样您就可以只从原始文件中流式传输要读取的部分。

您只需向数据事件添加一个侦听器,并将这些块存储到可写流中。

这里是概念,您可以在此基础上进行构建。

const fs      = require('fs');
const path    = require ('path');
const input   = 'video.mp4.zip';
const output1 = 'video.mp4.zip.part1';
const half    = fs.lstatSync(path.join(__dirname ,input)).size / 2;

const rstream = fs.createReadStream(path.join(__dirname ,input),
    {
        start : 0,
        end : half,
        autoClose: true
    }
);
writable = fs.createWriteStream(output1);
rstream.on ('data', (chunk) => {
    writable.write (chunk);
});

当阅读文件的第二部分时,从" half"开始创建可读流。位置

const rstream2 = fs.createReadStream(path.join(__dirname ,input), 
    {
        start : half,
        autoClose: true 
    }
);

还要记住将文件重新组合在一起时,也要指定可写流的起始位置。

希望有所帮助

答案 1 :(得分:0)

您可以使用 node-split-file 轻松拆分和合并文件部分。

这是一个完整的合并示例:

const fs = require('fs');
const splitFile = require('split-file');
const names = ["video.mp4.part1", "video.mp4.part2"];

splitFile.mergeFiles(names, __dirname + 'video.mp4')
  .then(() => {
    console.log('Done!');
  })
  .catch((err) => {
    console.log('Error: ', err);
  });