1

我想将一些 readeableStreams 压缩到一个 writableStream 中。目的是在内存中完成所有操作,而不是在磁盘上创建实际的 zip 文件。

为此我正在使用归档器

        let bufferOutput = Buffer.alloc(5000);
        let archive = archiver('zip', {
            zlib: { level: 9 } // Sets the compression level.
        });
        archive.pipe(bufferOutput);
        archive.append(someReadableStread, { name: test.txt});
        archive.finalize();

我在网上遇到错误archive.pipe(bufferOutput);

这是错误:“dest.on 不是函数”

我究竟做错了什么?谢谢

更新

我正在运行以下代码进行测试,并且未正确创建 ZIP 文件。我错过了什么?

const   fs = require('fs'),
    archiver = require('archiver'),
    streamBuffers = require('stream-buffers');

let outputStreamBuffer = new streamBuffers.WritableStreamBuffer({
    initialSize: (1000 * 1024),   // start at 1000 kilobytes.
    incrementAmount: (1000 * 1024) // grow by 1000 kilobytes each time buffer overflows.
});

let archive = archiver('zip', {
    zlib: { level: 9 } // Sets the compression level.
});
archive.pipe(outputStreamBuffer);

archive.append("this is a test", { name: "test.txt"});
archive.finalize();

outputStreamBuffer.end();

fs.writeFile('output.zip', outputStreamBuffer.getContents(), function() { console.log('done!'); });
4

4 回答 4

3

在您更新的示例中,我认为您正在尝试在编写内容之前获取内容。

挂钩到完成事件并获取内容。

outputStreamBuffer.on('finish', () => {
  // Do something with the contents here
  outputStreamBuffer.getContents()
})
于 2018-04-11T04:04:08.217 回答
1

至于为什么你看到垃圾,这是因为你看到的是压缩数据,看起来像垃圾。

要验证压缩是否有效,您可能需要再次解压缩并检查输出是否与输入匹配。

于 2017-07-19T11:52:54.840 回答
1

缓冲区不是流,您需要类似https://www.npmjs.com/package/stream-buffers

于 2017-07-19T10:28:39.193 回答
1

通过在存档器上添加事件侦听器对我有用:

archive.on('finish', function() {
   outputStreamBuffer.end();
   // write your file
});
于 2019-11-18T17:50:25.027 回答