我正在研究如何阅读“zip”文件。
我可以看到压缩包的内容。
但是现在让我们解决问题:
我需要检查“zip”文件以找到某种文件类型。但是如果在那个 zip 里面有另一个 zip,我看不到它的内容,因为我需要一个文件对象来传递给方法。
如您所见,文件不是目标文件类型。因此,我无法调用“FreeIcons - Copia.zip”的方法。
此时,我如何递归地(~迭代地,无论如何)检查用户输入的文件中的每个 zip 文件。
使用 zip.js 库,这是使用的代码
const reader = new zip.ZipReader(new zip.BlobReader(file)); //file => User entered file object
const entries = await reader.getEntries();
答案 0 :(得分:0)
使用 zip.js,您可以使用下面的函数,该函数接受一个 ZipReader
实例作为参数并递归返回所有条目。
async function getAllEntries(zipReader, options) {
let entries = await zipReader.getEntries(options);
entries = await Promise.all(entries.map(async entry => {
if (entry.filename.toLowerCase().endsWith(".zip")) {
const innerZipReader = new zip.ZipReader(new zip.BlobReader(await entry.getData(new zip.BlobWriter())));
return getAllEntries(innerZipReader, options);
} else {
return entry;
}
}));
return entries.flat();
}
下面是展示如何使用它的代码示例。
/* global zip, Blob */
"use strict";
const TEXT_CONTENT = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod...";
const TEXT_CONTENT_BLOB = new Blob([TEXT_CONTENT], { type: "text/plain" });
test().catch(error => console.error(error));
async function test() {
// creates a zip file containing 3 text files
let zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"));
await zipWriter.add("lorem1.txt", new zip.BlobReader(TEXT_CONTENT_BLOB));
await zipWriter.add("lorem2.txt", new zip.BlobReader(TEXT_CONTENT_BLOB));
await zipWriter.add("lorem3.txt", new zip.BlobReader(TEXT_CONTENT_BLOB));
const loremZip1 = await zipWriter.close();
// creates a zip file containing 2 text files
zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"));
await zipWriter.add("another_lorem1.txt", new zip.BlobReader(TEXT_CONTENT_BLOB));
await zipWriter.add("another_lorem2.txt", new zip.BlobReader(TEXT_CONTENT_BLOB));
const loremZip2 = await zipWriter.close();
// creates a zip file containing the first zip file and a text file
zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"));
await zipWriter.add("lorem1.zip", new zip.BlobReader(loremZip1));
await zipWriter.add("another_lorem3.txt", new zip.BlobReader(TEXT_CONTENT_BLOB));
const loremZip3 = await zipWriter.close();
// creates a zip file containing the 2 previous files and a text file
zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"));
await zipWriter.add("lorem3.zip", new zip.BlobReader(loremZip3));
await zipWriter.add("lorem2.zip", new zip.BlobReader(loremZip2));
await zipWriter.add("yet_another_lorem.txt", new zip.BlobReader(TEXT_CONTENT_BLOB));
const compressedFile = await zipWriter.close();
// get all the entries recursively
const entries = await getAllEntries(new zip.ZipReader(new zip.BlobReader(compressedFile)));
document.body.innerHTML = entries.map(entry => entry.filename).join("<br>");
}
async function getAllEntries(zipReader, options) {
let entries = await zipReader.getEntries(options);
entries = await Promise.all(entries.map(async entry => {
if (entry.filename.toLowerCase().endsWith(".zip")) {
const innerZipReader = new zip.ZipReader(new zip.BlobReader(await entry.getData(new zip.BlobWriter())));
return getAllEntries(innerZipReader, options);
} else {
return entry;
}
}));
return entries.flat();
}
您可以在此处运行此代码:https://plnkr.co/edit/yhSnJFmsKyq6m4uH