在浏览器中,使用 @zip.js/zip.js 解压文件
npm i '@zip.js/zip.js'
import { BlobReader, ZipReader, TextWriter, Uint8ArrayWriter } from '@zip.js/zip.js';
async function extractFile(fileBlob) {
const result = { original: {}, parsed: {} };
const zipReader = new ZipReader(new BlobReader(fileBlob));
const entries = await zipReader.getEntries();
if (entries.length) {
for (let i = 0; i < entries.length; i += 1) {
const entry = entries[i];
const fileName = entry.filename || '';
const filePaths = fileName.split('/');
const isImage = /\.(jpg|png|jpeg|gif|jfif|webp)$/.test(fileName.toLowerCase());
const fileType = RegExp.$1;
const value = await entry.getData(
isImage ? new Uint8ArrayWriter() : new TextWriter(),
{
onprogress: (index, max) => {
},
},
);
result.original[fileName] = isImage ? Uint8ToBase64(value, fileType) : value;
let tempDir = result.parsed;
for (let j = 0; j < filePaths.length; j += 1) {
const path = filePaths[j];
if (!tempDir[path]) {
tempDir[path] = {};
}
if (j === filePaths.length - 1) {
tempDir[path] = result.original[fileName];
} else {
tempDir = tempDir[path];
}
}
}
console.log('result', result);
}
await zipReader.close();
return result;
}
function Uint8ToBase64(u8Arr, type) {
const CHUNK_SIZE = 0x8000;
let index = 0;
const length = u8Arr.length;
let result = '';
let slice;
while (index < length) {
slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length));
result += String.fromCharCode.apply(null, slice);
index += CHUNK_SIZE;
}
return 'data:image/' + type.toLowerCase() + ';base64, ' + btoa(result);
}