nodejs压缩为zip文件:archiver

​【简介】

包名: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包,下载量大,支持多种格式的压缩,方法简单上手快,文档健全,比较推荐~

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用Node.js中的Archiver模块,使用它可以轻松地解压zip文件。使用Archiver模块,只需要创建一个新的Archiver对象,然后调用它的extract方法,指定要解压缩文件路径,即可完成解压缩操作。 ### 回答2: 要使用archiver模块解压zip文件,您需要使用node.js中的node-archiver库。请按照以下步骤执行: 1. 首先,您需要在项目中安装node-archiver模块。您可以使用以下命令进行安装: ``` npm install archiver --save ``` 2. 导入所需的模块到您的代码中。您需要导入`archiver`模块和`fs`模块: ```javascript const archiver = require('archiver'); const fs = require('fs'); ``` 3. 创建一个解压缩的输出目录,用于保存解压出来的文件。您可以使用以下代码创建一个目录: ```javascript const outputDir = './output'; if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir); } ``` 4. 创建一个`zip`存档实例,并指定要解压的zip文件的路径: ```javascript const zipFilePath = './path/to/your/zipfile.zip'; const unzipper = archiver(zipFilePath); ``` 5. 设置解压的输出目录: ```javascript unzipper.directory(outputDir); ``` 6. 解压zip文件: ```javascript unzipper.extract(); ``` 7. 监听解压进度和完成事件: ```javascript unzipper.on('progress', function (progressData) { console.log(progressData); }); unzipper.on('finish', function () { console.log('Extraction completed successfully.'); }); ``` 8. 运行您的代码,并等待解压完成。解压的文件将会保存在指定的输出目录中。 请注意,解压zip文件可能需要一些时间,具体取决于zip文件的大小和您的计算机性能。 ### 回答3: Node.js提供了许多模块来处理文件压缩文件,其中一个常用的模块是archiver。archiver模块可用于创建和提取归档文件,例如zip文件。下面是使用archiver模块解压zip文件的步骤: 1. 首先,我们需要安装archiver模块。可以使用npm来安装,使用以下命令: ```shell npm install archiver ``` 2. 在Node.js代码中,我们需要引入archiver模块。可以使用以下代码: ```javascript const archiver = require('archiver'); ``` 3. 接下来,我们需要创建一个archiver对象,并指定要解压的zip文件的路径。可以使用以下代码: ```javascript const archive = archiver('zip', { zlib: { level: 9 } // 设置压缩级别 }); const zipFilePath = 'path/to/archive.zip'; // 要解压的zip文件路径 archive.open(fs.createReadStream(zipFilePath)); ``` 4. 然后,我们需要监听'entry'事件来获取解压的文件。可以使用以下代码: ```javascript archive.on('entry', function(entry) { console.log(entry.name); // 打印解压的文件名 }); ``` 5. 最后,我们需要将解压的文件提取到指定的目录。可以使用以下代码: ```javascript const extractPath = 'path/to/extract'; // 指定解压的目录 archive.on('end', function() { console.log('解压完成'); }); archive.pipe(unzipper.Extract({ path: extractPath })); // 提取到指定目录 archive.finalize(); ``` 以上就是使用archiver模块解压zip文件的步骤。通过创建一个archiver对象,打开zip文件,并使用pipe方法将解压的文件提取到指定的目录。在'entry'事件中,我们可以获取解压的文件的详细信息。在'end'事件中,我们可以在解压完成后执行任何操作。 需要注意的是,使用archiver模块解压zip文件之前,需要确保已经安装了解压zip文件所需的依赖模块,例如unzipper模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uikoo9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值