【简介】
包名:archiver
版本:3.0.0
依赖包数:7个
周下载量:110w
未解问题:40个
最后更新:6个月前
【总结】
1.下载量大
2.支持压缩,不支持解压缩
3.支持多种压缩格式,压缩方式也比较灵活
【完整代码】
包含了zipFile方法,zipFolder方法
var fs = require('fs');
var path = require('path');
var archiver = require('archiver');
/**
* zip file
* sourceFile,待压缩的文件
* destZip,压缩后的zip文件
* cb,callback
*/
function zipFile(sourceFile, destZip, cb){
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function(){
cb(null, 'zip file success!');
});
archive.on('error', function(err){
cb(err);
});
// zip
archive.pipe(output);
archive.file(sourceFile, {
name : path.basename(sourceFile)
});
archive.finalize();
}
/**
* zip folder
* sourceFolder,待压缩的文件夹
* destZip,压缩后的zip文件
* cb,回调函数
* subdir,是否需要包一层
*/
function zipFolder(sourceFolder, destZip, cb, subdir){
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function() {
cb(null, 'zip folder success!');
});
archive.on('error', function(err) {
cb(err);
});
// zip
archive.pipe(output);
archive.directory(sourceFolder, subdir ? sourceFolder.substr(path.dirname(sourceFolder).length + 1) : false);
archive.finalize();
}
【zip file-简单压缩】
将d:/test.js压缩到d:/test.zip中
var fs = require('fs');
var archiver = require('archiver');
/**
* zip file
* sourceFile,待压缩的文件
* destZip,压缩后的zip文件
* cb,callback
*/
function zipFile(sourceFile, destZip, cb){
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function(){
cb(null, 'zip file success!');
});
archive.on('error', function(err){
cb(err);
});
// zip
archive.pipe(output);
archive.file(sourceFile);
archive.finalize();
}
/**
* test
*/
function test(){
var sourceFile = 'd:/test.js';
var destZip = 'd:/test.zip';
zipFile(sourceFile, destZip, function(err, msg){
console.log(err, msg);
});
}
test();
效果如下,压缩正常
【zip file-不命名压缩】
将d:/zip/demo01/test.js压缩到d:/zip/demo01/test.zip中
压缩后的效果如下
可以看到,test.zip中不是直接包含test.js,而是把test.js之前的层级都压缩进去了,显然不是预期的结果。
【zip file-命名压缩】
发生以上问题的原因在于这行代码
// 这行代码,没有传入name属性
archive.file(sourceFile);
// 应该像这样
archive.file(sourceFile, {
name : 'test.js'
});
修改后的代码如下
var fs = require('fs');
var path = require('path');
var archiver = require('archiver');
/**
* zip file
* sourceFile,待压缩的文件
* destZip,压缩后的zip文件
* cb,callback
*/
function zipFile(sourceFile, destZip, cb){
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function(){
cb(null, 'zip file success!');
});
archive.on('error', function(err){
cb(err);
});
// zip
archive.pipe(output);
archive.file(sourceFile, {
name : path.basename(sourceFile)
});
archive.finalize();
}
/**
* test
*/
function test(){
var sourceFile = 'd:/zip/demo02/test.js';
var destZip = 'd:/zip/demo02/test.zip';
zipFile(sourceFile, destZip, function(err, msg){
console.log(err, msg);
});
}
test();
效果如下,是预期的结果
【zip file-中文压缩】
之前介绍的另一个nodejs下压缩解压缩的npm包“adm-zip”中存在一个问题,压缩和解压缩包含中文的文件名时会乱码,详见:https://uikoo9.blog.csdn.net/article/details/116381396
archiver会存在这个问题么?
var fs = require('fs');
var path = require('path');
var archiver = require('archiver');
/**
* zip file
* sourceFile,待压缩的文件
* destZip,压缩后的zip文件
* cb,callback
*/
function zipFile(sourceFile, destZip, cb){
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function(){
cb(null, 'zip file success!');
});
archive.on('error', function(err){
cb(err);
});
// zip
archive.pipe(output);
archive.file(sourceFile, {
name : path.basename(sourceFile)
});
archive.finalize();
}
/**
* test
*/
function test(){
var sourceFile = 'd:/zip/demo03/test-你好.js';
var destZip = 'd:/zip/demo03/test.zip';
zipFile(sourceFile, destZip, function(err, msg){
console.log(err, msg);
});
}
test();
效果如下,archiver不存在中文乱码问题
【zip folder】
将d:/zip/demo03文件夹压缩到d:/zip/demo04/test.zip中
var fs = require('fs');
var archiver = require('archiver');
/**
* zip folder
* sourceFolder,待压缩的文件夹
* destZip,压缩后的zip文件
* cb,回调函数
* subdir,是否需要包一层
*/
function zipFolder(sourceFolder, destZip, cb, subdir){
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function() {
cb(null, 'zip folder success!');
});
archive.on('error', function(err) {
cb(err);
});
// zip
archive.pipe(output);
archive.directory(sourceFolder, subdir || false);
archive.finalize();
}
/**
* test
*/
function test(){
var sourceFolder = 'd:/zip/demo03';
var destZip = 'd:/zip/demo04/test.zip';
zipFolder(sourceFolder, destZip, function(err, msg){
console.log(err, msg);
});
}
test();
效果如下,确实将d:/zip/demo03下的文件压缩到zip中
【zip folder-包含父文件夹】
上面的例子中,是将d:/zip/demo03文件夹下的文件都压缩到了test.zip中,有的时候需要的是将d:/zip/demo03整个文件夹直接压缩到test.zip中,其实只需要添加一个subdir属性即可
var fs = require('fs');
var archiver = require('archiver');
/**
* zip folder
* sourceFolder,待压缩的文件夹
* destZip,压缩后的zip文件
* cb,回调函数
* subdir,是否需要包一层
*/
function zipFolder(sourceFolder, destZip, cb, subdir){
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function() {
cb(null, 'zip folder success!');
});
archive.on('error', function(err) {
cb(err);
});
// zip
archive.pipe(output);
archive.directory(sourceFolder, subdir || false);
archive.finalize();
}
/**
* test
*/
function test(){
var sourceFolder = 'd:/zip/demo03';
var destZip = 'd:/zip/demo05/test.zip';
zipFolder(sourceFolder, destZip, function(err, msg){
console.log(err, msg);
}, true);
}
test();
压缩后的效果如下
【zip folder-命名父文件夹】
上例中将subdir设置为了true,效果是将所有父文件夹都压缩到了zip中,一般期望的效果是只将父文件夹一层压缩到zip中,这个效果可以通过设置subdir为文件名实现
var fs = require('fs');
var path = require('path');
var archiver = require('archiver');
/**
* zip folder
* sourceFolder,待压缩的文件夹
* destZip,压缩后的zip文件
* cb,回调函数
* subdir,是否需要包一层
*/
function zipFolder(sourceFolder, destZip, cb, subdir){
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function() {
cb(null, 'zip folder success!');
});
archive.on('error', function(err) {
cb(err);
});
// zip
archive.pipe(output);
archive.directory(sourceFolder, subdir ? sourceFolder.substr(path.dirname(sourceFolder).length + 1) : false);
archive.finalize();
}
/**
* test
*/
function test(){
var sourceFolder = 'd:/zip/demo03';
var destZip = 'd:/zip/demo06/test.zip';
zipFolder(sourceFolder, destZip, function(err, msg){
console.log(err, msg);
}, true);
}
test();
效果如下,zip中只包含了demo03一层文件夹
【文档】
archiver的文档做的比较好,详见https://archiverjs.com/index.html
【end】
1.介绍了archiver的常见使用方法zipFile,zipFolder
2.介绍了archiver压缩文件和文件夹一些常见需求的代码实现
archiver是nodejs上支持压缩的npm包,下载量大,支持多种格式的压缩,方法简单上手快,文档健全,比较推荐~