我尝试使用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包来压缩文件夹或目录。任何建议或任何其他好方法来解决我的问题?
答案 0 :(得分:1)
你也可以使用node-archiver,这在我使用时非常有用。首先,您需要create
和archiver
的实例,如下所示:
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');
});
将zipName
和path
替换为您需要的内容。