微信小程序 - 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.mzph.cn/news/209774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript入门实战笔记 -- 开篇 为什么要选择 TypeScript ?

typescript 在线编辑器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

营收增速持续放缓,博通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为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回…

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…

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,若想获取…

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.…

酷开科技以创新为动力用大数据提升品牌认知

在21世纪的今天,我们生活在一个被互联网深深改变的世界。互联网不仅改变了我们的生活方式,也正在改变我们的思维方式和工作方式。而互联网作为一种新的发展趋势,更是为我们提供了无数的机会和无限可能性,从电子商务时代到社交网络…

scala编码

1、Scala高级语言 Scala简介 Scala是一门类Java的多范式语言,它整合了面向对象编程和函数式编程的最佳特性。具体来讲Scala运行于Java虚拟机(JVM)之上,井且兼容现有的Java程序,同样具有跨平台、可移植性好、方便的垃圾回收等特性…

启动游戏出现concrt140.dll错误的8种解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是找不到concrt140.dll文件。这个错误通常会导致程序无法正常运行,给用户带来困扰。本文将介绍找不到concrt140.dll无法继续执行代码的8个方法,同时探讨concrt140.dll丢…

LinuxBasicsForHackers笔记 -- 文件系统和存储设备管理

设备目录/dev Linux 有一个特殊的目录,其中包含代表每个连接设备的文件:相应命名的 /dev 目录。 /dev中有很多设备列表。 特别令人感兴趣的是设备 sda1、sda2、sda3、sdb 和 sdb1,它们通常是硬盘驱动器及其分区以及 USB 闪存驱动器及其分区…

理解基于 Hadoop 生态的大数据技术架构

转眼间,一年又悄然而逝,时光荏苒,岁月如梭。当回首这段光阴,不禁感叹时间的匆匆,仿佛只是一个眨眼的瞬间,一年的旅程已成为过去,而如今又到了画饼的时刻了 ! 基于 Hadoop 生态的大数…

固态硬盘SSD

目录 1.2 组成1.3 读写性能特性1.4 与机械硬盘相比的特点1.5 磨损均衡技术 \quad \quad SSD基于闪存技术Flash Memory, 属于电可擦除ROM, 即EEPROM \quad 1.2 组成 \quad \quad \quad 系统对固态硬盘的读写是以页为单位的 固态硬盘里的块相当于机械硬盘里的磁道 固态硬盘里的页…

Redis基础系列-持久化

Redis基础系列-持久化 文章目录 Redis基础系列-持久化1. 什么是持久化2. 为什么要持久化3. 持久化的两种方式3.1 持久化方式1:RDB(redis默认持久化方式)3.11 配置步骤-自动触发3.12 配置步骤-手动触发3.12 优点3.13 缺点3.14 检查和修复RDB快照文件3.15 哪些情况会触…

ubuntu22.04 安装cuda

CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA 的 GPU(图形处理单元)进行高效的计算处理。CUDA 通过提供一系列的 C、C 和 Fortran 扩展,使得开发…

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台,但是由于还没有拿到EVT。所以,就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后,充满剩余时间异常的问题。 问题描述,在充电过程中,显示充满时间为“0 min left unt…