nodejs中使用archive压缩文件的实现代码


Posted in NodeJs onNovember 26, 2019

前言

archive是一款在nodejs中可以实现跨平台打包的工具

可以将文件压缩为zip或rar格式

是一个比较好用的第三方模块

install

npm install archiver --save

archive github地址:https://github.com/archiverjs/node-archiver

Quick Start

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

// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/example.zip');
//设置压缩格式为zip
var archive = archiver('zip', {
  zlib: { level: 9 } // Sets the compression level.
});

// listen for all archive data to be written
// 'close' event is fired only when a file descriptor is involved
output.on('close', function() {
  console.log(archive.pointer() + ' total bytes');
  console.log('archiver has been finalized and the output file descriptor has closed.');
});

// This event is fired when the data source is drained no matter what was the data source.
// It is not part of this library but rather from the NodeJS Stream API.
// @see:  https://nodejs.org/api/stream.html#stream_event_end
output.on('end', function() {
  console.log('Data has been drained');
});

// good practice to catch this error explicitly
archive.on('error', function(err) {
  throw err;
});
// pipe archive data to the file
archive.pipe(output);
// append a file from stream
var file1 = __dirname + '/file1.txt';
archive.append(fs.createReadStream(file1), { name: 'file1.txt' });

// append a file from string
archive.append('string cheese!', { name: 'file2.txt' });
// append a file from buffer
var buffer3 = Buffer.from('buff it!');
archive.append(buffer3, { name: 'file3.txt' });

// append a file
archive.file('file1.txt', { name: 'file4.txt' });

// append files from a sub-directory and naming it `new-subdir` within the archive
archive.directory('subdir/', 'new-subdir');

// append files from a sub-directory, putting its contents at the root of archive
archive.directory('subdir/', false);

// append files from a glob pattern
archive.glob('subdir/*.txt');

// finalize the archive (ie we are done appending files but streams have to finish yet)
// 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand
archive.finalize();

实际使用

实际使用中情况可能会比较多

需要打包的源文件一般为远程文件,比如某一个第三方的文件存放地址,这时则需要先将第三方文件下载到本地

示例方法,可以根据实际需要修改相应的参数

function download(files){
  //下载文件的本地存档地址
  //示例 files = [{name: 'xxxx.js',url:'https://xx/xx/xxxx.js'}]
  let dirPath = path.resolve(__dirname, '文件存放的本地位置')
  mkdir(dirPath);

  let tmps = files.map((item,index) => {
    let stream = fs.createWriteStream(path.resolve(dirPath, item.name));

  return new Promise((resolve,reject)=>{
    try {
      request(item.url).pipe(stream).on("close", function (err) {
        console.log("文件[" + item.name + "]下载完毕");

        resolve({
          url: path.resolve(dirPath, item.name),
          name: item.name
        })
      });
    } catch (e) {
      reject(e||'')
    }
  })
});

return new Promise((res,rej)=>{
  Promise.all(tmps).then((result) => {
    console.log(result)
    res(result)
  }).catch((error) => {
    console.log(error||'')
  })
})
}

//创建文件夹目录
function mkdir(dirPath) {
  if (!fs.existsSync(dirPath)) {
    fs.mkdirSync(dirPath);
    console.log("文件夹创建成功");
  } else {
    console.log("文件夹已存在");
  }
}

将下载到本地的文件打包为一个zip文件,可以参照 Quick Start 中的api组合使用

// append files from a sub-directory, putting its contents at the root of archive
 archive.directory('subdir/', false);
 //要注意第二个参数false,这个参数代表打包后的文件相对于output的目录结构,不写这个参数代表按照第一个参数('subdir/')的目录层级

打包之后的文件位置是在本地位置,此时在推送到前端页面中下载url需要组装成http或https的地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
Nodejs如何复制文件
Mar 09 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
Jan 04 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
NodeJS实现一个聊天室功能
Nov 25 #NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 #NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 #NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 #NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 #NodeJs
nodejs实现UDP组播示例方法
Nov 04 #NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 #NodeJs
You might like
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
潜说js对象和数组
2011/05/25 Javascript
js倒计时小程序
2013/11/05 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
angularjs指令之绑定策略(@、=、&)
2017/04/13 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
JS监听组合按键思路及实现过程
2020/04/17 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
python中input()与raw_input()的区别分析
2016/02/27 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python编程嵌套函数实例代码
2018/02/11 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
利用python求积分的实例
2019/07/03 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
python绘制动态曲线教程
2020/02/24 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
怎样比较两个类型为String的字符串
2016/08/17 面试题
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
社团文化节邀请函
2014/01/10 职场文书
2014年组织部工作总结
2014/11/14 职场文书
政协委员个人总结
2015/03/03 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
小学思品教学反思
2016/02/20 职场文书