一、前言

最近有这样的一个需求,需要把两个同名的.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压缩包的更多相关文章

  1. Node.js JXcore 打包

    Node.js 是一个开放源代码.跨平台的.用于服务器端和网络应用的运行环境. JXcore 是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线 ...

  2. sencha touch+phonegap+node.js打包

    这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境下,最后 ...

  3. 使用pkg打包Node.js应用的方法步骤

    Node.js应用不需要经过编译过程,可以直接把源代码拷贝到部署机上执行,确实比C++.Java这类编译型应用部署方便.然而,Node.js应用执行需要有运行环境,意味着你需要先在部署机器上安装Nod ...

  4. Node.JS 项目打包 JXCore

    哈哈,又回来了 当你开发完成了Node.JS项目,你应该需要打包发行吧 好,JXCore就是干这个的啦! 嗯,可能你会这样来安装 1. curl http://jxcore.com/xil.sh | ...

  5. 使用pkg打包node.js项目(egg框架)为可执行包

    问题: 公司有个工具型项目使用node.js 开发,需要部署到客户的服务器中,遇到的问题: 1.客户的服务器没有外网.环境配置,依赖安装等都比较麻烦,只能手工上传,最好能一个文件直接搞定: 2.直接包 ...

  6. 使用Node.js完成的第一个项目的实践总结

    http://blog.csdn.net/yanghua_kobe/article/details/17199417 项目简介 这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理.通过为每个资 ...

  7. 深入浅出Node.js(上)

    (一):什么是Node.js Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟 ...

  8. Node.js入门:Node.js&NPM的安装与配置

    Node.js安装与配置      Node.js已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对0.4.x版本而言的,并非适合最新的0.6.x的版本情况了,对此,我们将在0. ...

  9. 配置 node.js 环境

    安装 Node.js 1. 下载 Node.js, 首先到官网 http://nodejs.org/download/ 的下载页面下载 Windows 版本, 这里有两种版本,推荐 .msi 的安装程 ...

随机推荐

  1. JavaScript简单了解

    一.JavaScript 的诞生历史 在最初的时候 JS 主要解决的问题是一些服务器端语言(perl)对数据的 验证功能,在js 出现之前要对表单的数据进行验证需要将数据提交到服务器 端之后才能验证数 ...

  2. 【Topcoder 1643】PossibleOrders

    题意:给一些等价关系,问把所有的数按照大小排序的种类数. 思路:首先并查集维护等价类,然后设有\(n\)个等价类. 那么就可以\(dp\)了. 考虑\(dp(i)\)表示还剩下\(i\)个等价类,答案 ...

  3. nginx 配置文件的结构

    1.nginx.conf的主要部分 events { } http { server { location path { ... } location path { ... } } server { ...

  4. Qt中的QWebView

    一.Webkit了解   Webkit是一个开源的浏览器引擎,chrome也使用了作为核心.Qt中对Webkit做了封装,主要有以下几个类: QWebView :最常用的类,作为一个窗体控件 QWeb ...

  5. hadoop用户写入文件权限不够的问题

    问题: 普通用户echo写入文件,提示权限不够. 解决方式: sudo tee test.txt <<< "要插入内容"

  6. docker(四) 使用Dockerfile构建镜像

    下面以一个例子来演示构建镜像的过程. #在/tmp目录下演示 cd tmp mkdir build-redis-image 1.创建Dockerfile文件 vim Dockerfile 并写入如下内 ...

  7. 最简单的 springboot 发送邮件,使用thymeleaf模板

    1,导入需要的包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  8. webBrowser兼容

    using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; ...

  9. springdata find立即加载 get延迟加载 get返回的是一个动态代理对象 特点是 用的时候才会查询 否则不查询

  10. thymeleaf 页面获取当前页面的完整URL地址

    下面两种方法是一样的 <div th:text="${#httpServletRequest.getRequestURL() +'?'+ #httpServletRequest.get ...