gpt4 book ai didi

javascript - 如何使用 Node Js、Archiver 和 Express 正确下载 .zip 文件

转载 作者:行者123 更新时间:2023-12-03 07:10:23 26 4
gpt4 key购买 nike

我正在尝试压缩两个目录的内容并下载生成的 .zip 文件。一个目录包含 .txt 文件,另一个目录包含 .jpg 文件。我正在使用 archiver 来压缩文件并在 Node js 上运行 Express 框架。我倾向于认为问题存在于下载步骤中,因为在项目根目录中创建的结果压缩文件按预期扩展,但是当下载文件时,我收到“错误 2 - 没有这样的文件或目录。 ”

    app.get('/download',function(req, res){

zipFile = new Date() + "-Backup.zip";

var output = fs.createWriteStream(__dirname +"/backups/"+ zipFile);
var archive = archiver('zip');

output.on('close', function() {
console.log(archive.pointer() + ' total bytes');
console.log('archiver has been finalized and the output file descriptor has closed.');
});

archive.on('error', function(err) {
throw err;
});

archive.pipe(output);

var files1 = fs.readdirSync(__dirname+'/posts');
var files2 = fs.readdirSync(__dirname+'/uploads');
for(var i = 0; i< files1.length; i++){
archive.append(fs.createReadStream(__dirname+"/posts/"+files1[i]), { name: files1[i] });
}
for(var i = 0; i< files2.length; i++){
archive.append(fs.createReadStream(__dirname+"/uploads/"+files2[i]), { name: files2[i] });
}
archive.finalize();
res.download(__dirname + "/backups/" + zipFile, zipFile);

});

zipFile 是一个全局变量。

“关闭”日志正常触发,没有发生错误,但文件下载后无法打开。响应 header 是否存在问题或我不知道的其他问题?

感谢您的帮助。

最佳答案

我使用 node-zip 解决了我自己的问题作为存档实用程序。

var zip = require('node-zip')(); // require the node-zip utility
var fs = require('fs'); // I use fs to read the directories for their contents

var zipName = "someArbitraryName.zip"; // This just creates a variable to store the name of the zip file that you want to create
var someDir = fs.readdirSync(__dirname+"/nameOfDirectoryToZip"); // read the directory that you would like to zip
var newZipFolder = zip.folder('nameOfDirectoryToZip'); // declare a folder with the same name as the directory you would like to zip (we'll later put the read contents into this folder)


//append each file in the directory to the declared folder
for(var i = 0; i < someDir.length,i++){
newZipFolder.file(someDir[i], fs.readFileSync(__dirname+"/nameOfDirectoryToZip/"+someDir[i]),{base64:true});
}

var data = zip.generate({base64:false,compression:'DEFLATE'}); //generate the zip file data

//write the data to file
fs.writeFile(__dirname +"/"+ zipName, data, 'binary', function(err){
if(err){
console.log(err);
}
// do something with the new zipped file
}

本质上,正在发生的事情可以分为 3 个步骤:

  1. 使用 fs 读取您要压缩的目录的内容。
  2. 使用 zip.folder 声明文件夹,然后使用 zip.file 将文件附加到该目录。我只是使用 for 循环迭代地将每个文件添加到步骤 1 中读取的目录中。
  3. 使用 zip.generate 创建 .zip 文件数据,并使用 fs 将其写入文件。

可以下载生成的文件或执行任何您想要的操作。我没有发现使用此方法有任何问题。

如果您想要压缩多个目录,只需在 zip.generate 之前重复步骤 1 和 2,为每个目录创建一个新的 zip.folder。

关于javascript - 如何使用 Node Js、Archiver 和 Express 正确下载 .zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36636851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com