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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
nodejs npm install全局安装和本地安装的区别
Jun 05 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 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的面试题集
2006/11/19 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
图片按比例缩放函数
2006/06/26 Javascript
用js做一个小游戏平台 (一)
2009/12/29 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
javascript的内存管理详解
2013/08/07 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
js 颜色选择插件
2017/01/23 Javascript
详解nodejs中exports和module.exports的区别
2017/02/17 NodeJs
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
Android面试宝典
2013/08/06 面试题
数字天堂软件测试面试题
2012/12/23 面试题
九年级数学教学反思
2014/02/02 职场文书
社区八一活动方案
2014/02/03 职场文书
四年大学生活的自我评价范文
2014/02/07 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
个人授权委托书样本
2014/09/13 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书