node.js - папка архивирования с использованием архиватора создает пустой zip - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь заархивировать папку, используя 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-файл.

Это совершенно новое для меня, и я хотел бы понять, почему почтовый файл пуст?

С уважением

1 Ответ

0 голосов
/ 10 октября 2019

Протестировал следующий код и он работает:

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);
});
...