一、前言

最近有这样的一个需求,需要把两个同名的.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. DEV SIT UAT PET SIM PRD PROD常见环境英文缩写含义

    英文缩写 英文 中文 DEV development 开发 SIT System Integrate Test 系统整合测试(内测) UAT User Acceptance Test 用户验收测试 P ...

  2. zabbix源码安装 令人窒息的操作

    一.简介 zabbix-server主要分为2部分: zabbix程序 程序根据客户端的监控项,从客户端获取数据并写入到数据库,再根据触发器/动作等配置进行操作. 展示页面 使用php编写,php脚本 ...

  3. 抽象类练习(Job和TestJob)

    package com.Summer_0427.cn; /** * @author Summer * 根据抽象类完成以下题目 * 某软件公司对程序员的工作有一个总体的规定, * 不同的类型的程序员可以 ...

  4. Golang 入门系列(二)学习Go语言需要注意的坑

    上一章节我们已经了解了 Go 环境的配置,不了解的,请查看前面的文章 https://www.cnblogs.com/zhangweizhong/p/9459945.html,本章节我们将学习 Go ...

  5. 5行代码实现微信小程序图片上传与腾讯免费5G存储空间的使用

    本文介绍了如何在微信小程序开发中使用腾讯官方提供的云开发功能快速实现图片的上传与存储,以及介绍云开发的 5G 存储空间的基本使用方法,这将大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频 ...

  6. C#中字节数组(byte[])和字符串相互转换

    转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string&quo ...

  7. nginx中的epoll模型

    要了解epoll模型,就要一个一个知识点由浅至深地去探索. 1.IO复用技术 IO流请求操作系统内核,有串行处理和并行处理两种概念. 串行处理是前面一个操作处理地时候,后面的所有操作都需要等待.因此, ...

  8. Linux命令(五)创建文件或修改文件时间 touch

    Linux中 touch 命令可以改变文档或目录时间, 包括存取时间或更改时间, 也可以用于创建新文件. 命令格式: touch [选项] [参数] 选项: -a   只更改文件的读取时间. -m   ...

  9. C#中字符串的字面值(转义序列)

    在程序开发中,经常会碰到在字符串中字面值中使用转义序列,下面表格收集了下转义序列的完整列表,以便大家查看引用: 转义序列列表 转义序列 产生的字符 字符的Unicode值 \' 单引号 0x0027 ...

  10. hdu-5786(补图最短路)

    题意:给你n个点,m条无向边,问你这n个点构成的完全图,不用那m条边,由一个s出现的单源最短路 解题思路:首先,暴力建图不行,点太多,那么我们就按照它的规则来,把m条边建好,但是建的这个图表示不走的方 ...