node.js-使用archiver归档文件夹生成空zip
我正在尝试使用存档文件夹,我要存档的文件夹的路径如下所示:node.js-使用archiver归档文件夹生成空zip,node.js,express,zip,Node.js,Express,Zip,我正在尝试使用存档文件夹,我要存档的文件夹的路径如下所示: Project | app.js | tmp | folderToArchive │file1.txt │file2.txt │file3.txt var archiver = require("archiver"); app.get("/download/:folder", (req, r
Project
| app.js
| tmp
|
folderToArchive
│file1.txt
│file2.txt
│file3.txt
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文件的服务器端代码如下所示:
Project
| app.js
| tmp
|
folderToArchive
│file1.txt
│file2.txt
│file3.txt
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文件是空的
“关于”测试了以下代码,它可以正常工作:
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);
});
这可能与我有一个空存档的原因相同,这是在存档写入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();
});
});
}
tmp文件夹和我的app.js文件在同一个目录中,因此我使用了_dirname