#javascript
Вопрос:
Я изучаю, как читать zip-файлы.
Я использовал две библиотеки. zip.js и JSZip.
Я вижу содержимое почтового ящика.
Но теперь давайте перейдем к проблеме:
Мне нужно проверить файлы «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();
Ответ №1:
С 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
Комментарии:
1. источник: github.com/gildas-lormeau/zip.js/discussions/265