获取 ReadStream 的哈希和流的输出数据
Get hash of ReadStream and output data of stream
我有一个要多次读取的 ReadStream。 readStream 是用 fs.createReadStream.
创建的
我第一次用它来获取它的 md5
哈希,我用模块 hasha
、函数 fromStream
来做,第二次我用它与 FormData
一起将文件上传到虚拟主机。
如何使用这个 ReadStream 来完成这两件事?
readStream = fs.createReadStream("/tmp/test.txt");
hash = await hasha.fromStream(readStream, hashOptions);
readStream.on("data", (chunk) => console.log("data chunk", chunk)).on("end", () => console.log("finished"));
它没有按应有的方式将内容记录到控制台,可能是因为在 hasha.fromStream
中它正在 pipe
-ing 流。如果我不执行 hasha.fromStream
它工作正常,记录块。
我正在使用的名为 hasha
的模块在 github 上:https://github.com/sindresorhus/hasha/blob/master/index.js#L45
我不想在获取哈希之前将数据保存到缓冲区,因为我将在大文件中使用它。
我还制作了一个 runkit 脚本来显示我的问题,你可以在那里玩一下:
https://runkit.com/5942fba4653ae70012196b77/5942fba4653ae70012196b78
您可以通过重新读取文件来重新创建流,也可以倒回流,如此处所述:
这是一个独立示例,说明如何 "fork" 一个流,以便您可以将其通过管道传输到两个目的地:
const PassThrough = require('stream').PassThrough;
async function hashAndPost(stream) {
let pass1 = new PassThrough();
let pass2 = new PassThrough();
stream.pipe(pass1);
stream.pipe(pass2);
// Destination #1
pass1.on('data', chunk =>
console.log('data chunk', chunk.toString())
).on('end', () =>
console.log('finished')
);
// Destination #2
let hash = await hasha.fromStream(pass2, { algorithm : 'md5' });
console.log('hash', hash);
};
我有一个要多次读取的 ReadStream。 readStream 是用 fs.createReadStream.
创建的我第一次用它来获取它的 md5
哈希,我用模块 hasha
、函数 fromStream
来做,第二次我用它与 FormData
一起将文件上传到虚拟主机。
如何使用这个 ReadStream 来完成这两件事?
readStream = fs.createReadStream("/tmp/test.txt");
hash = await hasha.fromStream(readStream, hashOptions);
readStream.on("data", (chunk) => console.log("data chunk", chunk)).on("end", () => console.log("finished"));
它没有按应有的方式将内容记录到控制台,可能是因为在 hasha.fromStream
中它正在 pipe
-ing 流。如果我不执行 hasha.fromStream
它工作正常,记录块。
我正在使用的名为 hasha
的模块在 github 上:https://github.com/sindresorhus/hasha/blob/master/index.js#L45
我不想在获取哈希之前将数据保存到缓冲区,因为我将在大文件中使用它。
我还制作了一个 runkit 脚本来显示我的问题,你可以在那里玩一下: https://runkit.com/5942fba4653ae70012196b77/5942fba4653ae70012196b78
您可以通过重新读取文件来重新创建流,也可以倒回流,如此处所述:
这是一个独立示例,说明如何 "fork" 一个流,以便您可以将其通过管道传输到两个目的地:
const PassThrough = require('stream').PassThrough;
async function hashAndPost(stream) {
let pass1 = new PassThrough();
let pass2 = new PassThrough();
stream.pipe(pass1);
stream.pipe(pass2);
// Destination #1
pass1.on('data', chunk =>
console.log('data chunk', chunk.toString())
).on('end', () =>
console.log('finished')
);
// Destination #2
let hash = await hasha.fromStream(pass2, { algorithm : 'md5' });
console.log('hash', hash);
};