關於node.js中的jszip

jszip

jszip是一個用來創建,讀和編輯zip文件的javaScrip庫。最近工作需要通過url讀取zip文件,並把他下載解壓到指定目錄。(此處的zip文件包含了多個子文件夾或者子文件,所以會涉及到判斷是否是文件夾,並創建文件目錄的知識點),先看代碼(裏面的註釋很重要的哦):

const JSZip = require('jszip');
const fs = require('fs');
const axios = require('axios');

// 1. 根據zip文件的下載url下載zip文件並解壓
/*
* 1.1. zipUrl指的就是下載的url,比如 http://hnust/test.zip(只是舉例,具體就是你下載時需要請求的url)
* 1.2. 此處用的是axios發get請求,需要特別注意的是 ***responseType: 'arraybuffer'***,這個一定要寫,不寫的話,後面無法讀取解壓數據。
* 1.3. 使用JSZip.loadAsync()讀取請求到的數據 response.data
* 1.4. 最後返回讀取解壓後的數據 zipData.files, files是解壓後數據的屬性
*/
async function getZipFiles(zipUrl) {
        const response = await axios({
            method: 'get',
            url: zipUrl,
            responseType: 'arraybuffer',
        });
        const zipData = await JSZip.loadAsync(response.data);
        return zipData.files;
    }

//2. 將解壓好的數據保存到指定路徑
/*
* 2.1. 返回回來的zipData.files是一個Object,不能直接用for...of...遍歷,所以這裏用 Object.keys(files)將他的keys取出來遍歷。
* 2.2. 可能組要用到path這個庫去拼接我們需要保存文件的路徑,比如你需要保存到d://test文件夾下,然後需要保存的文件名是/project/helloWold.txt, 那麼使用 path.join(`${basePath}/`, filename)後,你最終就是要保存d://test/project/helloWorld.txt這個文件
* 2.3. 在這裏會涉及到zip文件中包含子文件夾怎麼辦, 先用 files[filename].dir判斷他是否是文件夾,如果是文件夾,再用fs.statSync(dest).isDirectory()判斷這個文件夾是否存在,要是不存在才用fs.mkdirSync(dest, { recursive: true });創建該文件夾,recursive: true這個參數很重要,它爲true纔可以創建子文件夾
* 2.4. 最後如果這只是個普通的文件不是文件夾,就用files[filename].async('nodebuffer')讀取出來,再用fs.writeFileSync(dest, content))寫入目標路徑。要說明的是‘nodebuffer’這個參數也是必需要指定的(我們讀的是buffer類型數據,不指定是會發生亂碼的),然後writeFileSync是同步寫入文件內容,你要用異步的方法也可以。
*/
function saveZipFiles(files, basePath) {
     const path = require('path');
     try {
         for (const filename of Object.keys(files)) {
             const dest = path.join(`${basePath}/`, filename);
             if (files[filename].dir && !fs.statSync(dest).isDirectory()) {
                 fs.mkdirSync(dest, { recursive: true });
             }
             files[filename].async('nodebuffer')
             .then((content) => fs.writeFileSync(dest, content));          
         }
     } catch (error) {
         appLogger.error('save zip files encountered error!', error.message);
         return error;
     }
 }

這是我對jszip的初步認識和使用,以後還有別的在做補充啦,希望能夠幫助大家啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章