使用 express 和 archiver 创建 zip

Posted

技术标签:

【中文标题】使用 express 和 archiver 创建 zip【英文标题】:Creating zip using express and archiver 【发布时间】:2019-03-04 23:56:29 【问题描述】:

我使用 node-archiver 来压缩文件,如下所示。但我得到损坏的 zip 文件。

app.get('/download', async (req, res) => 

    const arch = archiver('zip');
    arch.append('abc',  name: 'abc.txt');
    arch.append('cdf',  name: 'cdf.txt');

    res.attachment('test.zip').type('zip');
    arch.pipe(res);
    arch.finalize();
);

我修改了代码直接保存到文件系统。使用此代码,我得到一个在文件系统上创建的工作 zip 文件。

app.get('/download', async (req, res) => 


    const arch = archiver('zip');
    arch.append('abc',  name: 'abc.txt');
    arch.append('cdf',  name: 'cdf.txt');

    const output = fs.createWriteStream('./test.zip');
    arch.pipe(output);
    arch.finalize();
);

为什么 zip 文件在通过 express res 对象发送时会损坏?解决办法是什么?

编辑: 如果我使用输出格式为tar 而不是 zip,它可以正常工作。

const arch = archiver('tar');

【问题讨论】:

【参考方案1】:

我认为您也需要关闭响应流:

app.get('/download', async (req, res) => 

    const arch = archiver('zip');
    arch.append('abc',  name: 'abc.txt');
    arch.append('cdf',  name: 'cdf.txt');

    res.attachment('test.zip').type('zip');
    arch.on('end', () => res.end()); // end response when archive stream ends
    arch.pipe(res);
    arch.finalize();
);

【讨论】:

刚试过。它没有用。如果归档器格式为 tar,则无需使用 res.end() 关闭流即可

以上是关于使用 express 和 archiver 创建 zip的主要内容,如果未能解决你的问题,请参考以下文章

使用 socket.io 和 express 创建大厅

使用 Mongoose 和 Express 创建嵌入式文档

UVA11374 Airport Express

为啥有些开发者使用“http”和“express”来创建服务器? [复制]

无法从使用 Express.js 和 SQL Server 创建的 api 获得任何响应

如何在使用 NodeJS 和 Express 时创建 MySQL 连接池?