如何在节点js应用程序中压缩文件夹&邮编下载开始后?

时间:2015-10-27 09:25:33

标签: javascript angularjs node.js express nodes

我尝试使用npm包adm-zip 0.4.4,因为最新的0.4.7不起作用,adm-zip 0.4.4适用于Windows但不适用于Mac& Linux操作系统。另一个问题是我只希望zip_folder被压缩,但它会从folder_1开始整个目录结构。这是代码:

var zip = new admZip();

zip.addLocalFolder("./folder_1/folder_2/folder_3/**zip_folder**");

zip.writeZip("./folder_1/folder_2/folder_3/download_folder/zip_folder.zip");

所有这些都发生在服务器端。我搜索了很多,并尝试了许多npm包来压缩文件夹或目录。任何建议或任何其他好方法来解决我的问题?

2 个答案:

答案 0 :(得分:1)

你也可以使用node-archiver,这在我使用时非常有用。首先,您需要createarchiver的实例,如下所示:

var fs = require('fs');
var archiver = require('archiver');

var archive = archiver.create('zip', {});
var output = fs.createWriteStream(__dirname + '/zip_folder.zip');

这样您就可以告诉archiver根据您传递的方法格式压缩文件或文件夹。在这种情况下,它是zip。另外,我们创建一个writeStream,它将作为输出通过archiver传送。我们还使用directory方法在给定dirpath的情况下依次附加目录及其文件:

archive.pipe(output);

archive
  .directory(__dirname + '/folder_1/folder_2/folder_3/download_folder/zip_folder')
  .finalize();

最后,我们需要finalize阻止进一步附加到归档结构的实例。

另一个选择是使用bulk方法,如下所示:

archive.bulk([{ 
  expand: true, cwd: './folder_1/folder_2/folder_3/download_folder/zip_folder/', 
  src: ['**/*'] 
}]).finalize();

更新1

[**/*] syntax的一点解释:这将递归地包含所有文件夹**和文件*

答案 1 :(得分:1)

尝试使用系统的zip功能:

var execFile = require('child_process').execFile;
execFile('zip', ['-r', '-j', zipName, path], function(err, stdout) {
    if(err){
        console.log(err);
        throw err;
    }

    console.log('success');
});

zipNamepath替换为您需要的内容。