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服务器(3):代码模块化
Dec 18 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 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
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
纯php生成随机密码
2015/10/30 PHP
许愿墙中用到的函数
2006/10/07 Javascript
JavaScript 比较时间大小的代码
2010/04/24 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
JavaScript实现区块链
2018/03/14 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
Python内置函数dir详解
2015/04/14 Python
Python中的字符串替换操作示例
2016/06/27 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
Python Logging 日志记录入门学习
2018/06/02 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
机械设计及其自动化专业推荐信
2013/10/31 职场文书
新闻记者个人求职的自我评价
2013/11/28 职场文书
元旦晚会邀请函
2014/02/01 职场文书
开工仪式主持词
2014/03/20 职场文书
可可西里观后感
2015/06/08 职场文书
汉字听写大会观后感
2015/06/12 职场文书
Python学习开发之图形用户界面详解
2021/08/23 Python
如何利用python实现Simhash算法
2022/06/28 Python