我的目标是创建一个用于使用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
我想这是因为文件没有正确结束。那么,怎么做呢 (正确拆分并加入文件)?
答案 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);
});