Node.js使用jszip实现打包zip压缩包
一、前言
最近有这样的一个需求,需要把两个同名的.mtl文件和.obj文件打包成一个同名的.zip压缩包。刚开始文件不多的时候,只有几个,或者十几个,甚至二三十个的时候,还能勉强接受手动修改,但是随着项目的进展,手动压缩是没有效率且浪费时间的,于是就有了想用程序实现自动打包的想法。
二、使用jszip打包压缩包
首先项目的前端是通过jszip进行解压读取的,既然它能解压,自然也可以实现压缩。上GitHub上找了关于zip的压缩插件,还是发现jszip的star是排名第一的,不用用,有些过意不去啊。
开始我的步骤:
1、在Node.js项目里引入jszip包
npm install --save-dev jszip
2、jszip核心代码
var fs = require('fs');
var path = require('path');
var JSZip = require('jszip');
var config = {
// 文件根目录
dir:"C:/objs/ariport/"
} /**
* 把mtl文件和obj文件打包成zip压缩包
* @param {} fileName 不带文件后缀的文件名
* @param {} {delSource = false } = {} 是否删除源文件
*/
function toZipOfMtlObj (fileName, { delSource = false } = {}) {
var zip = new JSZip();
var extArr = ['.mtl', '.obj']; extArr.forEach(ext => {
let file = fileName + ext;
let content = getFileContent(fileName + ext);
zip.file(file, content);
}) // 压缩
zip.generateAsync({
// 压缩类型选择nodebuffer,在回调函数中会返回zip压缩包的Buffer的值,再利用fs保存至本地
type: "nodebuffer",
// 压缩算法
compression: "DEFLATE",
compressionOptions: {
level: 9
}
}).then(function (content) {
let zip = fileName + '.zip';
// 写入磁盘
fs.writeFile(getFullFileName(zip), content, function (err) {
if (!err) {
// 是否删除源文件
if (delSource) {
extArr.forEach(ext => {
delFile(fileName + ext);
})
}
} else {
console.log(zip + '压缩失败');
}
});
});
} /**
* 获取文件内容
* @param {string} fileName 文件名 file.mtl
*/
function getFileContent (fileName) {
// 指定encoding会返回一个string,否则返回一个Buffer
let content = fs.readFileSync(getFullFileName(fileName), { encoding: "utf-8" });
return content;
} /**
* 获取完整文件路径
* @param {string} fileName 文件名 file.mtl
*/
function getFullFileName (fileName) {
return path.join(config.dir, fileName);
} /**
* 删除文件
* @param {string} fileName 文件名 file.mtl
*/
function delFile (fileName) {
fs.unlink(getFullFileName(fileName), function (err) {
if (!!err) {
console.log('删除文件失败:' + file);
}
});
}
第一步:声明一个jszip压缩对象
var zip = new JSZip();
第二步:往jszip压缩对象添加文件
// jszip.file接收两个参数,第一个参数是文件名,第二个参数是内容
zip.file('Building_North_001.mtl','这里是内容,可以是string,也可以是Buffer');
zip.file('Building_North_001.obj','这里是内容,可以是string,也可以是Buffer');
// jszip还可以添加文件夹,这里我就不做说明,可以参考官方文档。
第三步:生成zip压缩包内容的Buffer值,专门为Node.js使用
// 压缩
zip.generateAsync({
// 压缩类型选择nodebuffer,在回调函数中会返回zip压缩包的Buffer的值,再利用fs保存至本地
type: "nodebuffer",
// 压缩算法
compression: "DEFLATE",
compressionOptions: {
level: 9
}
}).then(function (content) {
let zip = 'Building_North_001.zip';
// 写入磁盘
fs.writeFile('C:/objs/airport/' + zip , content, function (err) {
if (!err) {
// 写入磁盘成功
console.log(zip + '压缩成功');
} else {
console.log(zip + '压缩失败');
}
});
});
三、最后,总结
关于jszip压缩部分就这么多,这仅仅只是简单的一部分,更多的内容,可以访问jszip的官方介绍。
在实现这个压缩功能的过程中,也顺便复习了Node.js中文件系统fs的使用:
1、同步读取文件夹下的文件列表:fs.readdirSync(config.dir);
2、获取一个文件的属性:fs.statSync(filePath);
3、重命名:fs.rename(oldPath, newPath, function (err) {});
4、写入文件:fs.writeFile(fullPath, content, function (err) {});
5、同步读取文件内容,指定encoding会返回一个string,否则返回一个Buffer:fs.readFileSync(getFullFileName(fileName), { encoding: "utf-8" });
6、删除一个文件:fs.unlink(fullPath, function (err) {});
学无止境,总结就这么多了。
Node.js使用jszip实现打包zip压缩包的更多相关文章
- Node.js JXcore 打包
Node.js 是一个开放源代码.跨平台的.用于服务器端和网络应用的运行环境. JXcore 是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线 ...
- sencha touch+phonegap+node.js打包
这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境下,最后 ...
- 使用pkg打包Node.js应用的方法步骤
Node.js应用不需要经过编译过程,可以直接把源代码拷贝到部署机上执行,确实比C++.Java这类编译型应用部署方便.然而,Node.js应用执行需要有运行环境,意味着你需要先在部署机器上安装Nod ...
- Node.JS 项目打包 JXCore
哈哈,又回来了 当你开发完成了Node.JS项目,你应该需要打包发行吧 好,JXCore就是干这个的啦! 嗯,可能你会这样来安装 1. curl http://jxcore.com/xil.sh | ...
- 使用pkg打包node.js项目(egg框架)为可执行包
问题: 公司有个工具型项目使用node.js 开发,需要部署到客户的服务器中,遇到的问题: 1.客户的服务器没有外网.环境配置,依赖安装等都比较麻烦,只能手工上传,最好能一个文件直接搞定: 2.直接包 ...
- 使用Node.js完成的第一个项目的实践总结
http://blog.csdn.net/yanghua_kobe/article/details/17199417 项目简介 这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理.通过为每个资 ...
- 深入浅出Node.js(上)
(一):什么是Node.js Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟 ...
- Node.js入门:Node.js&NPM的安装与配置
Node.js安装与配置 Node.js已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对0.4.x版本而言的,并非适合最新的0.6.x的版本情况了,对此,我们将在0. ...
- 配置 node.js 环境
安装 Node.js 1. 下载 Node.js, 首先到官网 http://nodejs.org/download/ 的下载页面下载 Windows 版本, 这里有两种版本,推荐 .msi 的安装程 ...
随机推荐
- 在Mac OS X下使用Apache、PHP、MySQL、Netbeans、Yii
本文环境: Mac OS X:10.8.4 Apache:2.2.22 PHP:5.3.15 Netbeans:7.3.1 Yii:1.1.14 Mac OS X是内置了Apache服务器的,不过默认 ...
- ASP.NET Core使用HttpClient的同步和异步请求
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.I ...
- 区块链代币(Token)笔记 — — 术语
前言 接触区块链和数字货币差不多有大半年时间,一直在赶项目进度,现在有空整理补习一下相关的知识,只谈代币不谈区块链
- 03-JavaScript之数据类型
JavaScript之数据类型 1.介绍 JavaScript数据类型分为两类:原始类型(primitive type)和对象类型(object type) 2.原始类型 数字 - number.字符 ...
- [转帖]Go中的下划线
Go中的下划线 https://blog.csdn.net/wanglei9876/article/details/50475864 下划线的作用: 在import 时 是仅引入 init 函数 在正 ...
- CodeVs 1615 数据备份
题目:数据备份 链接:Here 题意:有n个点在一条线上,每次连线可以连接两个点(每个点只能被连一次),要求找出m个连线,他们的和最小(连线权值就是两点距离),输出最小的和.给出n.m和每个点的坐标. ...
- JVM中的垃圾回收算法GC
GC是分代收集算法:因为Young区,需要回收垃圾对象的次数操作频繁:Old区次数上较少收集:基本不动Perm区.每个区特点不一样,所以就没有通用的最好算法,只有合适的算法. GC的4大算法 1.引用 ...
- Jenkins与sonar扫描的集成问题
记录本周遇到的头疼了很久的一个问题,由于公司需要使用jenkins来自动管理构建项目,然后在关联sonar对项目代码质量进行审核. 接着坑爹的问题来了,原有的技术手段为项目构建成功后通过jenkins ...
- Python中的 一些常用技巧函数[.join()]
1.str.join(item)字符串操作函数,参数item可以是字符串.元组.字典,示例 ','.join('abc') [','.join('abc')] 输出: 'a,b,c'['a', 'b' ...
- Elastic Search 语法总结
1. 插入 PUT /megacorp/employee/1 { "first_name" : "John", "last_name" : ...