【问题标题】:node.js - use archiver where output is buffernode.js - 使用输出为缓冲区的存档器
【发布时间】:2017-12-24 13:15:06
【问题描述】:

我想将几个 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!'); });

【问题讨论】:

    标签: node.js archiverjs


    【解决方案1】:

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

    【讨论】:

    • 谢谢戴夫,如果您也可以提供帮助,我已经添加了一个后续问题
    【解决方案2】:

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

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

    【讨论】:

    • 我只是注意到它实际上卡在“outputStreamBuffer.getContents().pipe(output);”上并且没有处理
    • 啊,因为outputStreamBuffer.getContents() 给你一个缓冲区而不是一个流,所以它没有pipe() 函数。就做fs.writeFile('output.zip', outputStreamBuffer.getContents(), function() { console.log('done!'); });
    • 嗯...仍然不适合我。如果你可以看看,我已经更新了我的问题。非常感谢您的帮助
    【解决方案3】:

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

    挂钩到完成事件,然后获取内容。

    outputStreamBuffer.on('finish', () => {
      // Do something with the contents here
      outputStreamBuffer.getContents()
    })
    

    【讨论】:

      【解决方案4】:

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

      archive.on('finish', function() {
         outputStreamBuffer.end();
         // write your file
      });
      

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 2012-12-30
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        相关资源
        最近更新 更多