.gz
1、先把文件、文件流转换成需要的ArrayBuffer格式:
//单独封装的//此处files可以是[接口返回的文件流],也可以是input选择的文件信息中e.target.files//type可传''export const jsReadGZFiles = (files,type) => {return new Promise(function(resolve,reject){let blob = new Blob(files, {type })let reader = new FileReader();reader.onload = function () {resolve(reader.result)};reader.readAsArrayBuffer(blob);})}
2、安装pako
,npm i pako / yarn add pako 即可
const pako = require('pako') //import不可以let res = await jsReadGZFiles(e.target.files)const byteArray = new Uint8Array(res); // 切换数据编码为Uint8Arrayconst pakoArr = pako.ungzip(byteArray);console.log("带格式结果", pakoArr) //此为结果,可以转换为需要的格式,如pakoArr.buffer即为结果的ArrayBuffer格式数据
.tar
引入tarballjs,下载地址:tarballjs,仅使用tarball.js即可
import {TarReader} from "../../utils/tarball"let treader = new TarReader();treader.readFile(new File([此处ArrayBuffer类型数据],'此处临时文件名吧,用不到就随便写')).then((res)=>{console.log("此处是解压后文件信息列表数组", res)})
.tar.gz
上面两种解压组合起来就是解压.tar.gz的方法
1、先处理.gz
2、再处理.tar
3、读取文件文本内容
<input type="file" @change="getGZFileContent">import {TarReader} from "../../utils/tarball"const pako = require('pako')//input读取的压缩包,const getGZFileContent = async (e) => {//解压.gzlet res = await jsReadGZFiles(e.target.files) //如果后端返回的文件流,可直接[文件流]替换这里的e.target.filesconst byteArray = new Uint8Array(res); // 切换数据编码为Uint8Arrayconst pakoArr = pako.ungzip(byteArray);//解压.tarlet treader = new TarReader();treader.readFile(new File([pakoArr.buffer],'xxx')).then((res)=>{res.forEach((item,index)=>{//读取文本内容//其中一个文件名,我的是.json文件if(item.name == 'detection_report.json'){let content = treader.getTextFile(item.name);console.log(content) //指定文件的内容}})}).catch(()=>{})}
.zip
安装jszip
import JSZip from "jszip";let unz = new JSZip();//zipdata是不加[]的file或文件流unz.loadAsync(zipdata).then((res)=>{Object.keys(res.files).forEach((item,index)=>{//string可以更换,如blob//item是每个文件名unz.file(item).async("string").then((content)=>{console.log(content) //每个文件的文本内容})})})
(本文暂时只有解压没有压缩)