【问题标题】:node.js - Archiving folder using archiver generate an empty zipnode.js - 使用归档器归档文件夹生成一个空的 zip
【发布时间】:2019-10-09 22:07:53
【问题描述】:

我正在尝试使用archiver 归档一个文件夹,我要归档的文件夹的路径如下所示:

Project
| app.js
| tmp
    |
     folderToArchive
            │file1.txt 
            │file2.txt 
            │file3.txt 

将生成 zip 文件的服务器端代码如下所示:

var archiver = require("archiver");

    app.get("/download/:folder", (req, res) => {
    
      var FolderName = req.params.folder;
      var zipName = FolderName + ".zip";
      var source = path.join(__dirname, "tmp", FolderName);
      var out = path.join(__dirname, "tmp", zipName);
    
    
      const archive = archiver('zip', { zlib: { level: 9 }});
      const stream = fs.createWriteStream(out);
    
      return new Promise((resolve, reject) => {
        archive
          .directory(source, false)
          .on('error', err => reject(err))
          .pipe(stream)
        ;
    
        stream.on('close', () => resolve());
        archive.finalize();
        console.log("zip file created");
      });
    
    });

问题是当我运行应用程序时,它会在正确的目的地创建一个空的 zip 文件。

这对我来说是全新的,我想了解为什么 zip 文件是空的?

问候

【问题讨论】:

    标签: node.js express zip


    【解决方案1】:

    这可能与我有一个空存档的原因相同,这是在存档写入 zip 之前结束的主要过程。

    因此它应该被包装在一个承诺中,像这样:

        async function zipDirectory(source, dest) {
      const stream = fs.createWriteStream(dest);
      const archive = archiver('zip', { zlib: { level: 9 } });
    
      archive.on('error', function(err) {
      throw err;
      });
    
      await new Promise((resolve, reject) => {
        archive.pipe(stream);
        archive.directory(source, false);
        archive.on('error', err => {throw err;});
        archive.finalize();
    
        stream
            .on('close', function() {
            console.log(`zipped ${archive.pointer()} total bytes.`);
            resolve();
            });
      });
    }
    

    【讨论】:

      【解决方案2】:

      测试了以下代码,它可以工作:

      const path = require('path');
      const archiver = require('archiver');
      const fs = require('fs');
      
      const FolderName = "fol";
      const zipName = FolderName + ".zip";
      const source = path.join(__dirname, "tmp", FolderName);
      const out = path.join(__dirname, "tmp", zipName);
      
      const archive = archiver('zip', { zlib: { level: 9 }});
      const stream = fs.createWriteStream(out);
      
      archive
          .directory(source, false)
          .on('error', err => {throw err;})
          .pipe(stream);
      
      stream.on('close', () => console.log("closed"));
      archive.finalize();
      console.log("zip file created");
      

      所以我建议:

      const path = require('path');
      const archiver = require('archiver');
      const fs = require('fs');
      
      const archive = (folderName) => {
          const zipName = folderName + ".zip";
          const source = path.join(__dirname, "tmp", folderName);
          const out = path.join(__dirname, "tmp", zipName);
      
          const archive = archiver('zip', { zlib: { level: 9 }});
          const stream = fs.createWriteStream(out);
      
          archive
              .directory(source, false)
              .on('error', err => {throw err;})
              .pipe(stream);
      
          stream.on('close', () => console.log("closed"));
          archive.finalize();
          console.log("zip file created");
      };
      
      app.get("/download/:folder", (req, res) => {
          const folderName = req.params.folder;
          archive(folderName);
      });
      

      【讨论】:

      • tmp 文件夹和我的 app.js 文件在同一个目录中,所以这就是我使用 __dirname 的原因
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2019-04-02
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多