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 } = {} 是否刪除原始檔 */ functiontoZipOfMtlObj (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) {});
學無止境,總結就這麼多了。