前言:使用微信官方文档unzip来解压文件,安卓用户没问题可以正常显示解压,但是在真机调试中苹果用户解压出来的目录是空的;
小程序构建package.json文件
在app.js所在目录层级打开终端运行npm init
安装依赖文件jszip,file-saver;
npm i -s jszip
npm i -s file-saver
安装好后再开发工具中找到工具-构建npm
构建成功后开写入你的逻辑;
此处直接调到已经使用wx.downloadFile下载好压缩包保存到本地;
使用jszip(读取压缩包里面的内容,使用微信官方api进行保存)
在使用文件中引入
// 头部引入
const JSZip = require("jszip");
//方法
async jsZipLoad(filePath) {
const jszip = new JSZip();
// 使用微信官方api读取压缩包
let res = fs.readFileSync(filePath);
// 转换成流
const binData = new Uint8Array(res);
// jszip方法loadAsync读取压缩包;
let zip = await jszip.loadAsync(binData);
// 得到压缩包内的文件
for (let key in zip.files) {
let zipEntry = zip.files[key]; //每个文件
if (zipEntry.dir) { //判断是否是文件夹
let createPath = `${filePath.slice(0,filePath.lastIndexOf('.'))}/${zipEntry.name.slice(0,zipEntry.name.length-1)}`;
let res = fs.accessSync(createPath);//是文件夹先判断本地是否已创建,已创建直接省略,没创建则创建
if(!res){
fs.mkdirSync(createPath, true);
}
} else {
// 创建文件并写入
let data = await zipEntry.async("arraybuffer"); //得到每个文件流
fs.writeFile({
filePath: `${filePath.slice(0,filePath.lastIndexOf('.'))}/${zipEntry.name}`,
data,
encoding: 'utf8',
complete(e) {}
});
}
}
let readdirLocal = fs.readdirSync(`${filePath.slice(0,filePath.lastIndexOf('.'))}`); //读取解压后保存到本地的文件
console.log('可展示为列表',readdirLocal)
}
注意:程序运行中可能会出现错误:setImmediate is not defined ,出现这个错误的原因是因为setImmediate是node语言的语法,只需要要在node_modules/jszip/jszip.js中delay方法中的setImmediate改成setTimeout,再重新构建一下npm就行
exports.delay = function(callback, args, self) {
setImmediate(function () { //将setImmediate改成setTimeout
callback.apply(self || null, args || []);
});
};