1. 程式人生 > >Node.js使用jszip實現打包zip壓縮包

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

 

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