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制作爬虫全过程(续)
Dec 22 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 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
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
jQuery 自定义函数写法分享
2012/03/30 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
Python中Collection的使用小技巧
2014/08/18 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
python实现名片管理系统
2018/11/29 Python
Python读取指定日期邮件的实例
2019/02/01 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
英国在线花园中心:You Garden
2018/06/03 全球购物
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
医院护士专业个人的求职信
2013/12/09 职场文书
洗煤厂厂长岗位职责
2014/01/03 职场文书
环保标语口号
2014/06/13 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
浅谈golang 中time.After释放的问题
2021/05/05 Golang
教你nginx跳转配置的四种方式
2022/07/07 Servers