.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); // 切换数据编码为Uint8Array
const 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) => {
//解压.gz
let res = await jsReadGZFiles(e.target.files) //如果后端返回的文件流,可直接[文件流]替换这里的e.target.files
const byteArray = new Uint8Array(res); // 切换数据编码为Uint8Array
const pakoArr = pako.ungzip(byteArray);
//解压.tar
let 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) //每个文件的文本内容
})
})
})
(本文暂时只有解压没有压缩)