读取 zip 中的 zip

时间:2021-07-21 13:49:57

标签: javascript

我正在研究如何阅读“zip”文件。

我使用了两个库。 zip.jsJSzip.

我可以看到压缩包的内容。

但是现在让我们解决问题:

我需要检查“zip”文件以找到某种文件类型。但是如果在那个 zip 里面有另一个 zip,我看不到它的内容,因为我需要一个文件对象来传递给方法。

enter image description here

如您所见,文件不是目标文件类型。因此,我无法调用“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 个答案:

答案 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

相关问题