创建并发送 Zip 文件 -NODE JS

PtD*_*tDf 6 javascript zip post node.js

我正在尝试创建然后将 zip 文件发送到客户端。我知道如何创建它,但我在将它发送给客户时遇到了问题。我尝试了很多方法。我正在从客户端发送 POST 请求,作为响应,我想发送一个文件。这是我的服务器站点示例代码

var Zip = require('node-zip');
router.post('/generator', function(req, res, next) {
    var zip = new Zip;

    zip.file('hello.txt', 'Hello, World!');
    var options = {base64: false, compression:'DEFLATE'};
    fs.writeFile('test1.zip', zip.generate(options), 'binary', function (error) {
        console.log('wrote test1.zip', error);
    });
    res.setHeader('Content-disposition', 'attachment; filename=test1.zip');
    res.download('test1.zip');

}
Run Code Online (Sandbox Code Playgroud)

}); 我也尝试过这样的事情:

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', mimetype);

  var filestream = fs.createReadStream(file);
  filestream.pipe(res);
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下库:

  1. 节点-zip

  2. 档案员

谁能解释我该怎么做?

gol*_*mar 8

该模块也可以正常工作:https ://www.npmjs.com/package/adm-zip

不在服务器中创建临时 zip 文件的示例:

var AdmZip = require('adm-zip');
router.get('/zipFilesAndSend', function(req, res) {
    var zip = new AdmZip();
    // add local file
    zip.addLocalFile("./uploads/29/0046.xml");
    // get everything as a buffer
    var zipFileContents = zip.toBuffer();
    const fileName = 'uploads.zip';
    const fileType = 'application/zip';
    res.writeHead(200, {
        'Content-Disposition': `attachment; filename="${fileName}"`,
        'Content-Type': fileType,
      })
    return res.end(zipFileContents);
});
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说是更好的解决方案。如果您不需要使用express-easy-zip 获得的子文件夹,这是理想的选择 (2认同)

Wou*_*ter 4

我之前没有使用过node-zip或archiver(我通常只使用内置的zlib模块),但我立即注意到的一件事是你应该res.downloadwriteFile. 这样,只有在文件完全写入磁盘后,它才会发送文件。

fs.writeFile('test1.zip', zip.generate(options), 'binary', function (error) {
    res.download('test1.zip');
});
Run Code Online (Sandbox Code Playgroud)

我希望这个解决方案对您有用,如果不方便发表评论。

另外,我认为res.download为您设置 Content-disposition 标头,您不需要手动设置它。但并不能 100% 确定这一点。