天天看點

jszip 解壓壓縮包_Node.js使用jszip實作打包zip壓縮包

一、前言

最近有這樣的一個需求,需要把兩個同名的.mtl檔案和.obj檔案打包成一個同名的.zip壓縮包。剛開始檔案不多的時候,隻有幾個,或者十幾個,甚至二三十個的時候,還能勉強接受手動修改,但是随着項目的進展,手動壓縮是沒有效率且浪費時間的,于是就有了想用程式實作自動打包的想法。

jszip 解壓壓縮包_Node.js使用jszip實作打包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/"}

function toZipOfMtlObj (fileName, { delSource = false } ={}) {var zip = newJSZip();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+ '壓縮失敗');

}

});

});

}

functiongetFileContent (fileName) {

// 指定encoding會傳回一個string,否則傳回一個Buffer

let content= fs.readFileSync(getFullFileName(fileName), { encoding: "utf-8"});returncontent;

}

functiongetFullFileName (fileName) {returnpath.join(config.dir, fileName);

}

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

學無止境,總結就這麼多了。