微信小程序 - 創建 ZIP 壓縮包

微信小程序 - 創建 ZIP 壓縮包

  • 場景
  • 分享代碼片段
  • 導入 JSZip
  • 創建ZIP文件
  • 追加寫入文件
  • 測試方法
  • 參考資料

場景

微信小程序只提供了解壓ZIP的API,并沒有提供創建ZIP的方法。
當我們想把自己處理好的保存,打包ZIP保存下來時就需要自己實現了。

分享代碼片段

不想聽廢話的,直接看代碼
https://developers.weixin.qq.com/s/ChblKjmo7ZNd

在這里插入圖片描述

導入 JSZip

首先需要 jszip

const JSZip = require('../lib/jszip.min');
const fs = wx.getFileSystemManager();

jszip 在微信小程序無法直接跑。要處理一下。把 setImmediate 全部替換為 setTimeout
在這里插入圖片描述

創建ZIP文件

/*** 文件打包為 zip* @param {*} fileList 文件列表 [{ name: '文件名', path: '文件路徑'}]* @param {*} zipPath  保存壓縮包的路徑* @param {*} progress 處理進度更新時:回調*/
async function zip(fileList, zipPath, progress=res=>console.log){try {// 實例化 jszipvar jszip = new JSZip();// 遍歷文件列表,添加到 zip 文件列表中let total = fileList.length;fileList.forEach((file, index) => {jszip.file(file.name, new Uint8Array(fs.readFileSync(file.path)));progress({ percent: Math.round((index+1)/total) * 100, msg: `讀取資源 ${index+1}/${total}` });});// 生成壓縮包對象(uint8array)let content = await jszip.generateAsync({ type : JSZip.support.uint8array ? "uint8array" : "string" },meta => progress({ percent: Math.floor(meta.percent), msg: `創建 ZIP...` }) // { currentFile: '', percent: 100 });// 將 arrayBuffer 形式壓的縮包數據寫入二進制文件,生成 zipprogress({ percent: 0, msg: `保存 ZIP...` }); // 開始// 分塊寫入await appendFile({ filePath: zipPath, data: content.buffer, encoding: 'binary', progress: percent => progress({ percent: Math.floor(percent), msg: `保存 ZIP...` })}).then(() => {progress({ percent: 100, msg: `ZIP 保存完成` });}).catch(err => {console.error('寫入文件失敗:', err);  });} catch (err) {console.log(err);}
}

追加寫入文件

/*** 追加寫入文件* @param {string} filePath     文件路徑* @param {string} data         寫入數據* @param {string} encoding     編碼類型:默認 utf8* @param {number} chunkSize    寫入塊大小:默認 1048576 字節* @param {function} progress   更新進度回調*/
function appendFile(options) { let { filePath, data, encoding, chunkSize, progress } = Object.assign({encoding: 'utf8',     // 編碼類型,默認 utf8。想寫二進制用 'binary'chunkSize: 1048576,   // 每塊大小默認 1Mprogress: console.log // 更新進度}, options);// 文件總長度const fileLength = data instanceof ArrayBuffer ? data.byteLength : data.length;  // 文件小于 chunkSize 直接寫if(fileLength <= chunkSize){return new Promise((resolve, reject) => {try {resolve(fs.writeFileSync( filePath, data, encoding ));} catch (error) {reject(error);}      });}else{// 否則分塊寫入,并調用進度更新 callbackreturn new Promise((resolve, reject) => {// 先寫入一個空文件。(作用:有則清空,無則創建)fs.writeFileSync(filePath, new ArrayBuffer(0), encoding);// 已寫入長度let writtenLength = 0;// 寫入數據塊const writeChunk = () => {const chunkData = data.slice(writtenLength, writtenLength + chunkSize); // 切段fs.appendFile({  filePath,         // 文件路徑data: chunkData,  // 數據塊encoding,         // 編碼類型success: () => {  writtenLength += chunkSize; // 更新已寫入長度progress( Math.floor((writtenLength / fileLength) * 100)); // call回調函數更新進度  if (writtenLength < fileLength) {  writeChunk();  // 繼續寫入下一塊數據  } else {  resolve(writtenLength);  // 文件寫入完成:返回寫入長度}  },  fail: err => reject(err) });  };// 繼續調用寫入數據塊writeChunk();  });}
}

測試方法

test(){const zipFolder = `${wx.env.USER_DATA_PATH}/test`;const zipPath = `${zipFolder}/hello.zip`;let fileList = [];try {// 先創建對應目錄fileUtil.mkdir(zipFolder);// 生成測試文件for (let index = 0; index < 10; index++){let filePath = `${wx.env.USER_DATA_PATH}/test/hello${index}.txt`;fileList.push({ name: `hello${index}.txt`, path: filePath});const res = fs.writeFileSync( filePath, `測試數據${index+1}`, 'utf8' );console.log(res);}// 打包 zipfileUtil.zip(fileList, zipPath, console.log);// 保存 zipwx.saveFileToDisk({ filePath: zipPath, success: console.log, fail: console.error });} catch(e) {console.error(e)}}

參考資料

jszip:一個使用JavaScript創建、讀取和編輯.zip文件的庫,帶有一個可愛而簡單的API。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207460.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無重復字符的最長子串(LeetCode 3)

文章目錄 1.問題描述2.難度等級3.熱門指數4.解題思路方法一&#xff1a;暴力法方法二&#xff1a;滑動窗口 參考文獻 1.問題描述 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的最長子串的長度。 s 由英文字母、數字、符號和空格組成。 示例 1&#xff1a; 輸…

基于Java商品銷售管理系統

基于Java商品銷售管理系統 功能需求 1、商品管理&#xff1a;系統需要提供商品信息的管理功能&#xff0c;包括商品的錄入、編輯、查詢和刪除。每個商品應包含基本信息如名稱、編碼、類別、價格、庫存量等。 2、客戶管理&#xff1a;系統需要能夠記錄客戶的基本信息&#xf…

算法:常見的哈希表算法

文章目錄 兩數之和判斷是否互為字符重排存在重復元素存在重復元素字母異位詞分組 本文總結的是關于哈希表常見的算法 哈希表其實就是一個存儲數據的容器&#xff0c;所以其實它本身的算法難度并不高&#xff0c;只是利用哈希表可以對于一些場景進行優化 兩數之和 class Solut…

Michael.W基于Foundry精讀Openzeppelin第41期——ERC20Capped.sol

Michael.W基于Foundry精讀Openzeppelin第41期——ERC20Capped.sol 0. 版本0.1 ERC20Capped.sol 1. 目標合約2. 代碼精讀2.1 constructor() && cap()2.2 _mint(address account, uint256 amount) 0. 版本 [openzeppelin]&#xff1a;v4.8.3&#xff0c;[forge-std]&…

AI智能降重軟件大全,免費最新AI智能降重軟件

在當今信息爆炸的時代&#xff0c;內容創作者們面臨著巨大的寫作壓力&#xff0c;如何在保持高質量的前提下提高效率成為擺在許多人面前的難題。AI智能降重軟件因其獨特的算法和功能逐漸成為提升文案質量的得力助手。本文將專心分享一些優秀的AI智能降重軟件。 147SEO改寫軟件 …

云貝教育 |【技術文章】PostgreSQL中誤刪除數據怎么辦(一)

原文鏈接&#xff1a;【PostgreSQL】PostgreSQL中誤刪除數據怎么辦&#xff08;一&#xff09; - 課程體系 - 云貝教育 (yunbee.net) 在我們學習完PG的MVCC機制之后&#xff0c;對于DML操作&#xff0c;被操作的行其實并未被刪除&#xff0c;只能手工vacuum或自動vacuum觸發才會…

【分享】我想上手機器學習

目錄 前言 一、理解機器學習 1.1 機器學習的目的 1.2 機器學習的模型 1.3 機器學習的數據 二、學習機器學習要學什么 2.1 學習機器學習的核心內容 2.2 怎么選擇模型 2.3 怎么獲取訓練數據 2.4 怎么訓練模型 三、機器學習的門檻 3.1 機器學習的第一道門檻 3.2 機器…

最新版IDEA專業版大學生申請免費許可證教學(無需學校教育郵箱+官方途徑+非破解手段)

文章目錄 前言1. 申請學籍在線驗證報告2. 進入IDEA官網進行認證3. 申請 JB (IDEA) 賬號4. 打開 IDEA 專業版總結 前言 當你進入本篇文章時, 你應該是已經遇到了 IDEA 社區版無法解決的問題, 或是想進一步體驗 IDEA 專業版的強大. 本文是一篇學生申請IDEA免費許可證的教學, 在學…

unity 2d 入門 飛翔小鳥 小鳥碰撞 及死亡(九)

1、給地面&#xff0c;柱體這種添加2d盒裝碰撞器&#xff0c;小鳥移動碰到就不會動了 2、修改小鳥的腳本&#xff08;腳本命名不規范&#xff0c;不要在意&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : Mo…

kafka高吞吐、低延時、高性能的實現原理

作者&#xff1a;源碼時代-Raymon老師 Kafka的高吞吐、低延時、高性能的實現原理 Kafka是大數據領域無處不在的消息中間件&#xff0c;目前廣泛使用在企業內部的實時數據管道&#xff0c;并幫助企業構建自己的流計算應用程序。Kafka雖然是基于磁盤做的數據存儲&#xff0c;但…

可信固件-M (TF-M)

概述&#xff1a; 參考: Trusted Firmware-M Documentation — Trusted Firmware-M v2.0.0 documentation 開源代碼托管&#xff1a; trusted-firmware-m.git - Trusted Firmware for M profile Arm CPUs STM32 U5支持TF-M : STM32U5 — Trusted Firmware-M v2.0.0 document…

Meta Platforms推出Imagine:基于Emu的免費AI文本到圖像生成器服務

Meta Platform是Facebook、Instagram 和 WhatsApp 的母公司&#xff0c;也是領先的開源AI人工智能大語言模型 Llama 2的創建者。Meta Platforms 推出了一個名為 Imagine 的獨立文本到圖像 AI 生成器服務。Imagine 是基于 Meta 自己的 AI 模型 Emu 構建的&#xff0c;Emu 是在11…

循環結構中 break、continue、return 和exit() 的區別

循環結構中 break、continue、return 和exit() 的區別 文章目錄 循環結構中 break、continue、return 和exit() 的區別一、break語句二、continue語句三、return 語句四、exit() 函數 說明&#xff1a;本文內容參考牟海軍 著《C語言進階&#xff1a; 重點、難點與疑點解析》&a…

HTML程序大全(1):簡易計算器

HTML代碼&#xff0c;主要創建了幾個按鈕。 <div class"container"><div class"output" id"output">0</div><button class"button" onclick"clearOutput()" id"clear">C</button>…

C#調用win10系統自帶軟鍵盤的方法

上次做了個筆記是關于調用windows系統自帶的觸摸鍵盤的方法&#xff1a;C#調用Windows系統自帶觸摸鍵盤的方法_c# 虛擬鍵盤-CSDN博客 除了調用觸摸鍵盤&#xff0c;我們也可以通過調用win10的自帶軟鍵盤作為輸入途徑。 方法很簡單。 1、添加using System.Diagnostics引用。 …

選自《洛谷深入淺出進階篇》——歐拉函數+歐拉定理+擴展歐拉定理

歐拉函數&#xff1a; 歐拉函數定義&#xff1a; 1~n中與n互質的數的個數。 比如 歐拉函數是積性函數&#xff1a;&#xff08;也就是&#xff09;當 n與m互質的時候&#xff1a; 由算術基本定理&#xff0c;我們可以設n&#xff0c;那么我們只要計算出的取值就能求出的取…

5組10個共50個音頻可視化效果PR音樂視頻制作模板

我們常常看到的圖形跟著音樂跳動&#xff0c;非常有節奏感&#xff0c;那這個是怎么做到的呢&#xff1f;5組10個共50個音頻可視化效果PR音樂視頻制作模板滿足你的制作需求。 PR音樂模板|10個音頻可視化視頻制作模板05 https://prmuban.com/36704.html 10個音頻可視化視頻制作…

linux下查看文件當下的所有文件的大小和查找大文件

要查詢一個文件夾下面所有文件的總大小&#xff0c;您可以使用 du 命令配合一些參數。如果您只關心總大小&#xff0c;而不是各個子文件夾或文件的大小&#xff0c;可以使用以下命令&#xff1a; du -sh /path/to/your/directory在這個命令中&#xff1a; du 是磁盤使用情況的…

設計師福利!免費實用的7款Figma插件,讓你的工作事半功倍!

如今&#xff0c;Figma已經成為主流的原型和數字設計軟件之一&#xff0c;許多UI設計師和設計團隊開始選擇使用Figma。隨著Figma的快速更新和迭代&#xff0c;Figma插件庫變得越來越豐富。如果使用得當&#xff0c;將有助于提高您的設計效率。本文將介紹7個工作中非常實用的Fig…

echarts詞云圖echarts-wordcloud使用方法

1、echarts5.0以下的版本使用 echarts-wordcloud 1.0 的詞云 1. 安裝 wordCloud 1.0 依賴包npm install echarts-wordcloud12. man.js 注入import echarts-wordcloud 2、echarts5.0及以上的下載 echarts-wordcloud 2.0 版本 注意&#xff1a;npm install echarts-wordcloud …