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) {});

 

学无止境,总结就这么多了。

posted @ 2018-11-26 22:10  蟹行者  阅读(12725)  评论(0编辑  收藏  举报