0

我正在尝试压缩两个目录的内容并下载生成的 .zip 文件。一个目录包含 .txt 文件,另一个目录包含 .jpg。我正在使用归档器压缩文件并在节点 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 是一个全局变量。

on 'close' 日志正确触发并且没有发生错误,但文件在下载后不会打开。响应标头或其他我不知道的问题是否存在问题?

谢谢您的帮助。

4

1 回答 1

1

我使用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。

于 2016-07-21T12:26:38.280 回答