微信小程序 - PC端選擇ZIP文件

微信小程序 - PC端選擇文件

  • 分享代碼片段
  • 場景分析
  • 解決思路
  • 附魔腳本
  • chooseMediaZip 選擇附魔后的ZIP文件
    • 相關方法
    • 測試方法
  • 參考資料

分享代碼片段

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

場景分析

如果你的微信小程序需要選中 ZIP 包,然后解壓并處理其中的文件。
對于移動端可以使用 wx.chooseMessageFile(Object object) 來實現,它支持從客戶端會話選擇文件。
但不幸的是PC端,并不支持此API。官方也沒有給出別的API。(當然論壇里有提到一個曲線解決方案,申請個企業號,用webview實現選擇文件。網上有討論的,這里就不細聊了。)
但是對于個人號來說,這就尷尬了。一是沒有權限使用webview,二是純前端的小程序,為了選擇文件還得加個服務器,有點不值當。
所以想到了一個曲線的解決方案。利用:chooseMedia

解決思路

  1. 雖然PC端不支持 wx.chooseMessageFile 但支持 wx.chooseMedia 這個API是用來選擇媒體文件的,比如:視頻、圖片。
  2. 通過測試,直接將 zip 的擴展名改為 PNG 是無效的。因為選擇后,它會檢查文件頭,過濾掉不符合的,最終只能拿到真實的PNG文件。
  3. 既然它是校驗了文件頭,那我們就給ZIP文件前加上PNG的文件名,然后通過 wx.chooseMedia 獲取到文件后,再跳過我們自己的 PNG頭,把剩余的ZIP部分讀出來,保存為一個正常的 ZIP 文件。
  4. 然后就可以正常解壓或讀取 ZIP 壓縮包了。

附魔腳本

PNG頭加到ZIP文件前面,可以使用下面這個腳本實現。
這是附魔的bat腳本,通過在zip前添加25個字節,是PNG文件的頭89504E470D0A1A0A0000000D49484452轉成的base64

echo iVBORw0KGgoAAAANSUhEUg==>_________
copy /b _________ + /b %1 %~nx1.png
del /q _________

zip拖到腳本上之后,即可生成一個 xxx.zip.png 文件。

chooseMediaZip 選擇附魔后的ZIP文件

const fs = wx.getFileSystemManager();/*** 選擇媒體附魔的ZIP* @param {object} options */
function chooseMediaZip(options = {}){const defaultOptions = { count: 9,                                 // 單次選擇數量上限mediaType: ['image'],                     // 選擇框支持的文件類型encoding: 'binary',                       // 編碼類型,默認 'binary'。想寫文本用 'utf8'folder: `${wx.env.USER_DATA_PATH}/jerry`, // 保存二進制文件的路徑suffix: 'zip'                             // 二進制文件的擴展名};let params = {...defaultOptions, ...options};return wx.chooseMedia(params) // 選擇 *.zip.png 文件.then(res=>{ // 跳過 PNG 讀取出實際二進制數據return res.tempFiles.map(tempFile=> {// 跳過PNG頭25字節,從26開始讀取 zip 的二進制部分const arrayBuffer  = readFileSync(tempFile.tempFilePath, '', 26);console.log(arrayBuffer);// 寫 二進制文件 到目錄 pathconst file = {};file.name = `${Date.now()}.${suffix}`;file.path =`${ params.folder }/${ file.name }`;mkdir(params.folder); writeFileSync( file.path, arrayBuffer, encoding ); // 寫 二進制 文件return file; // {name: 'fileName', path: 'http://xxx.xxx'}});}).catch(console.error);
}

相關方法

chooseMedia 需要用到的幾個方法

/*** 判斷文件或目錄是否存在* @param {string} path 文件或目錄路徑*/
function isExist(path){try {fs.accessSync(path);return true;} catch (err) {console.log(`文件或目錄不存在:${err.message}`);return false;}
}/*** 創建目錄路* 如果目錄不存在就創建。* @param {string} dirPath 文件夾路徑* @param {boolean} recursive 如果上級目錄不存在,是否自動創建。默認:是*/
function mkdir(path, recursive = true){if(isExist(path) == false){                       // 判斷目錄是否存在fs.mkdirSync(path, recursive);                  // 如果沒有就創建}
}/*** 寫文件* @param {*} filePath 文件路徑。要寫入的文件路徑 (本地路徑)* @param {*} data 要寫入的文本或二進制數據* @param {*} encoding 指定寫入文件的字符編碼。默認 binary*/
function writeFileSync(filePath, data, encoding='binary') {  fs.writeFileSync(filePath, data, encoding);
}

測試方法

test(e){fileUtil.chooseMediaZip({ count: 9,                                 // 單次選擇數量上限mediaType: ['image'],                     // 選擇框支持的文件類型encoding: 'binary',                       // 編碼類型,默認 'binary'。想寫文本用 'utf8'folder: `${wx.env.USER_DATA_PATH}/jerry`, // 保存二進制文件的路徑suffix: 'zip'                             // 二進制文件的擴展名}).then(res => {res.forEach(zip => {fs.readZipEntry({'filePath': zip.path,'entries': 'all',success: res => console.log(res.entries), // zip中的文件列表fail: err => console.log(err)});});});}

在這里插入圖片描述

參考資料

判斷文件/目錄是否存在(同步版) FileSystemManager.accessSync(string path)
創建目錄(同步版) FileSystemManager.mkdirSync(string dirPath, boolean recursive)
寫文件(同步版) FileSystemManager.writeFileSync(string filePath, string|ArrayBuffer data, string encoding)

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

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

相關文章

TypeScript入門實戰筆記 -- 開篇 為什么要選擇 TypeScript ?

typescript 在線編輯器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

openEuler學習05-kernel升級

周末沒事,嘗試下openEuler的kernel升級 [rootlocalhost ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)" ANSI_…

營收增速持續放緩,博通CEO期待AI崛起救場 | 百能云芯

博通作為蘋果等大型科技公司的芯片供應商,于周四發布了財報。盡管截至10月29日的第四季度營收增長了4%至93億美元,符合市場預期,但增速已經降至2020年以來的最低水平。 由于企業客戶和電信供應商在控制支出方面的謹慎態度,博通的銷…

IDEA構建springBoot新項目時JDK只有17和21,無法選擇JDK8解決方案

今天創建springboot新項目時,發現IDEA里JDK選項只有17和21,無法選擇本機的JDK8,網上查資料后發現是springboot2.7于11.24號后停止維護,基于2.7和java8的spring Initializ官方不再維護,解決方案是在server URL欄&#x…

東北大學Python

目前金屬礦開采,爆破還是主要的破巖方式,為了保證巷道采場的安全,需要對爆破震動進行監測,獲取的監測數據如附件,第1列數據為震動的序號,第2、3、4列為x,y,z三個方向的震動速度,往往由于各種因素…

C++ 運算符重載與操作符重載

目錄 運算符重載 運算符重載的特性 其他運算符重載的實現 默認成員函數——賦值運算符重載 默認成員函數——取地址操作符重載 const成員 附錄 運算符重載 C為了增強代碼的可讀性引入了運算符重載,運算符重載是具有特殊函數名的函數,也具有其返回…

使用Vue實現一個當鼠標懸浮時出現,鼠標離開時消失的雙層菜單

前言 分享一個基于Vue實現一個當鼠標懸浮時出現,鼠標離開時消失的雙層菜單。同時也是為了以后需要類似的需求時,可以提供一個實現思路,以及可以快速ctrlc和ctrlv操作,提高工作效率~ 一、示例代碼 (1)/sr…

Linux C/C++ 分析網絡流量(十六進制TCP數據包分析)

在分析TCP數據包時,理解TCP協議的工作原理和報文格式是關鍵。TCP是一種面向連接的、提供可靠的、端到端的字節流傳輸服務。其頭部結構包括源端口、目標端口、序列號、確認應答號等字段。序列號是在建立連接時由計算機生成的隨機數作為初始值,每發送一次數…

使用Pytorch從零開始實現BERT

生成式建模知識回顧: [1] 生成式建模概述 [2] Transformer I,Transformer II [3] 變分自編碼器 [4] 生成對抗網絡,高級生成對抗網絡 I,高級生成對抗網絡 II [5] 自回歸模型 [6] 歸一化流模型 [7] 基于能量的模型 [8] 擴散模型 I, 擴散模型 II…

前端食堂技術周刊第 107 期:技術播客節、Deno Cron、FEDAY、XState v5、Electron 2023 生態系統回顧

美味值:🌟🌟🌟🌟🌟 口味:烤椰拿鐵 食堂技術周刊倉庫地址:https://github.com/Geekhyt/weekly 大家好,我是童歐巴。歡迎來到前端食堂技術周刊,我們先來看下…

圖論與網絡優化3

CSDN 有字數限制,因此筆記分別發布,目前: 【筆記1】概念與計算、樹及其算法【筆記2】容量網絡模型、遍歷性及其算法【筆記3】獨立集及其算法 6 獨立集及其算法 6.1 獨立集和覆蓋 6.1.1 獨立數和覆蓋數 獨立集:設 S ? V ( G …

PaddleDetection系列2--NCCL安裝及測試

NCCL安裝及測試 1 系統信息查看1.1 查看本機的操作系統和位數信息:1.2 確認處理器架構1.3 確認cuda版本 2 NCCL安裝2.1 根據上面的系統架構以及CUDA版本,進入[官網](https://developer.nvidia.com/nccl/nccl-download)下載匹配的nccl,若想獲取…

力扣44題通配符匹配題解

44. 通配符匹配 - 力扣(LeetCode) 給你一個輸入字符串 (s) 和一個字符模式 (p) ,請你實現一個支持 ? 和 * 匹配規則的通配符匹配: ? 可以匹配任何單個字符。* 可以匹配任意字符序列(包括空字符序列)。 …

【ITK庫學習】使用itk庫進行圖像濾波ImageFilter:梯度Gradient

目錄 1、itkGradientImageFilter2、itkGradientMagnitudeImageFilter 梯度強度3、itkGradientMagnitudeRecursiveGaussianImageFilter 帶濾波的梯度強度4、itkDerivativeImageFilter 不帶濾波的導函數 1、itkGradientImageFilter 該類是一個基類,用于使用方向導數計…

C++筆試題之回文數的判斷

“回文”是指正讀反讀都能讀通的句子,它是古今中外都有的一種修辭方式和文字游戲,如“我為人人,人人為我”等。在數學中也有這樣一類數字有這樣的特征,成為回文數(palindrome number)。 設n是一任意自然數…

MSSQL 程序集使用方法

1.C# 寫一個程序 1.1新建一個項目【類庫【.Net FrameWork】 1.2編寫代碼 刪除 namespace ApiSQLClass { } 代碼如下:【具體調用API模式根據具體編寫】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.…

1. 使用poll或epoll創建echo服務器

1. 說明&#xff1a; 此篇博客主要記錄一種客戶端實現方式&#xff0c;和兩種使用poll或者epoll分別創建echo服務器的方式&#xff0c;具體可看代碼注釋&#xff1a; 2. 相關代碼&#xff1a; 2.1 echoClient.cpp #include <iostream> #include <cstdio> #incl…

C語言中的 sizeof 運算符

在 C 語言中&#xff0c;sizeof 是一個運算符&#xff0c;用于獲取給定類型或變量的字節大小。它返回一個 size_t 類型的值&#xff0c;表示以字節為單位的對象大小。 sizeof 運算符有以下特點&#xff1a; 用法&#xff1a;sizeof 運算符可以應用于數據類型或表達式。計算靜…

酷開科技以創新為動力用大數據提升品牌認知

在21世紀的今天&#xff0c;我們生活在一個被互聯網深深改變的世界。互聯網不僅改變了我們的生活方式&#xff0c;也正在改變我們的思維方式和工作方式。而互聯網作為一種新的發展趨勢&#xff0c;更是為我們提供了無數的機會和無限可能性&#xff0c;從電子商務時代到社交網絡…