用jszip解压zip文件

jszip地址:https://github.com/Stuk/jszip

jszip的.d.ts文件
jszip.d.ts.zip (2.5 KB)

如果是微信小游戏环境下遇到JSZip is not defined,在jszip.min.js文件最后添加;if(!window.JSZip){window.JSZip = module.exports;}

导入库

将jszip.min.js拖入到creator中,设置为插件。

解压

1.用zip工具压缩json配置。假设压缩名称为config.zip。将zip包拖到resources目录下

2.用cc.loader.load加载二进制格式的zip文件

let url = cc.url.raw('resources/config.zip');
cc.loader.load({ url: url, type: "binary" }, (err: Error, zipData: ArrayBuffer) => {
    //2.1.3在安卓平台下会出现load不到资源的情况
    if(err) {
        let httpUrl = `资源服务地址${url}`;
        console.log('loadConfigZip httpUrl: ', httpUrl);
        let oReq = new XMLHttpRequest();
        oReq.open("GET", httpUrl, true);
        oReq.responseType = "arraybuffer";

        oReq.onload = function (oEvent) {
            let arrayBuffer = oReq.response; // 注意:不是oReq.responseText
            if (arrayBuffer) {
                console.log('LoadConfig::unzip 0');
                this.unzip(arrayBuffer);
            }
       };
       oReq.send(null);
    }
    else {
        this.unzip(zipData);
    }
});

3.读取压缩包的内容

unzip(zipData) {
    let newZip = new JSZip(); // 因为将jszip导入为插件,所以可以全局直接访问
    newZip.loadAsync(zipData).then(zip=>{
        zip.file('test.json').async('string').then(data=>{
            let json = JSON.parse(data);
        });
    });
}
18赞

可以呀,支持兄弟!

可惜没早点遇到这个需求,不然就能即使解决你的问题了:grin:

大佬 还有一个如何压缩怎么搞

let fs = require("fs");//获取文件系统模块,负责读写文件
let path = require("path");//工具模块,处理文件路径的小工具
let JSZIP = require("jszip");
let zip = new JSZIP();

//读取目录及文件
function readDir(obj, nowPath) {
    let files = fs.readdirSync(nowPath);//读取目录中的所有文件及文件夹(同步操作)
    files.forEach(function (fileName, index) {//遍历检测目录中的文件
        console.log(fileName, index);//打印当前读取的文件名
        let fillPath = nowPath + "/" + fileName;
        let file = fs.statSync(fillPath);//获取一个文件的属性
        if (file.isDirectory()) {//如果是目录的话,继续查询
            let dirlist = zip.folder(fileName);//压缩对象中生成该目录
            readDir(dirlist, fillPath);//重新检索目录文件
        } else {
            obj.file(fileName, fs.readFileSync(fillPath));//压缩目录添加文件
        }
    });
}

//开始压缩文件
function startZIP() {
    var currPath = __dirname;//文件的绝对路径 当前当前js所在的绝对路径
    var targetDir = path.join(currPath, "configs");
    readDir(zip, targetDir);
    zip.generateAsync({//设置压缩格式,开始打包
        type: "nodebuffer",//nodejs用
        compression: "DEFLATE",//压缩算法
        compressionOptions: {//压缩级别
            level: 9
        }
    }).then(function (content) {
        fs.writeFileSync(currPath + "/configs.zip", content, "utf-8");//将打包的内容写入 当前目录下的 result.zip中
    });
}

startZIP();

1赞

也可以解压远程的 zip

不过一般通过服务器配置 gzip 之后都能客户端都能读取到远端的 zip 包

嗯嗯,知道了。

谢谢 大佬 我试试

let url = cc.url.raw('resources/config');
我用 2.3.2 这一句要设置为 才可以
let url = cc.url.raw('resources/config.zip');

ps, url 不对,err 也是 null了,导致我折腾了很久。

抱歉,我自己写的时候是加了zip后缀。:joy:

内容已经修改。感谢提醒。

再请教一个问题,
微信上报这个错误怎么处理的?

gameThirdScriptError
Cannot find module ‘buffer’
Error: Cannot find module ‘buffer’

我刚才打包微信环境试了下:提示JSZip is not defined
https://developers.weixin.qq.com/community/develop/doc/00086c290e4e8095ad6691cd651c00

你那种情况我这边没出现

是的,这个是导入插件的情况。
我没导入插件,直接require的。
放到分包里面会出现Cannot find module 'buffer'
放到主包里面OK。

愁。。。

这种操作没试过。

确实分包就出现问题。。。

怎么搞,这里出错了

报的什么错。

throw new Error(“Corrupted zip: missing " + Math.abs(i) + " bytes.”)

发布头条时,包体超过八兆,分包时我把一部分资源放到七牛上,平时资源不压缩上传有点慢,可以使用这种方式先压缩包上传,然后玩家进游戏的时候下载压缩包获取文件的吗