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 相关文章推荐
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
yii中widget的用法
2014/12/03 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
IE8下String的Trim()方法失效的解决方法
2013/11/08 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
python通过yield实现数组全排列的方法
2015/03/18 Python
浅谈django中的认证与登录
2016/10/31 Python
win与linux系统中python requests 安装
2016/12/04 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
酒店总经理欢迎词
2014/01/08 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
社区母亲节活动方案
2014/03/05 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2016党校培训心得体会
2016/01/07 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers