纯粹在浏览器中使用zip.js

时间:2018-12-20 12:46:26

标签: javascript html zip zip.js

我想使用zip.js编辑存储在zip文件夹中的多个文本文件的内容。这完全需要在网络浏览器中完成,而无需将zip文件夹上传到后端服务器。

事实证明,这是一个非常具有挑战性的问题,尤其是由于需要大量的回调函数。我已经设法打开了zip文件夹并打印出其中包含的所有文本文件的内容,但是我不知道如何打开文本文件,编辑内容然后将文件保存在zip-文件夹。此外,我想对zip文件夹中的所有文本文件执行此操作。

最简单的方法可能只是查看GitHub上的代码。只需克隆它,然后打开索引文件进行测试。

此部分代码中缺少解决方案的地方,可以在file-converter2.js中找到:

function addFile(filename, content) {
  zip.createWriter(new zip.BlobWriter(), function(writer) {
    // use a TextReader to read the String to add
    writer.add(filename, new zip.TextReader(content), function() {
      // onsuccess callback
      // close the zip writer
      writer.close(function(blob) {
        // HOW TO SAVE BACK INTO ZIP HERE?
      });
    });
  }, handleInProgress, onerror);
}

这是我编辑文本文件的地方,但是我不知道如何将编辑后的文件保存回zip文件夹(覆盖旧内容)。为了进行编辑,在编辑内容之前,我首先需要阅读文本文件的内容:

function readAndEditBlob(el, reader, i, length, editFunc, showFileCounter = true) {
  let filename = getFilename(el);
  el.getData(new zip.TextWriter(), function(data) {
    if (DEBUG) {
      console.log('File content of zip file is:')
      console.log(data);
    }
    if (editFunc) {
      editFunc(filename, ' Hello world.'); // "editFunc" would be "addFile" in this case.
    }
    reader.close(function() {
      if (showFileCounter) { handleClose(i + 1, length); }
    });
  }, handleInProgress);
}

function readAndEditFiles(file, editFunc, showFileCounter = true) {
  zip.createReader(
    new zip.BlobReader(file), 
    function(reader) {
      reader.getEntries(function(entries) {
        let length = entries.length
        if (length) {
          entries.forEach(function(el, i) {
            readAndEditBlob(el, reader, i, length, editFunc, showFileCounter);
          });
        }
      });
    },
    onerror
  );
}

现在,我的代码能够遍历zip文件夹中的所有文件,并打印出其中包含的文本文件的内容。我还能够创建带有已编辑内容的Blob,但找不到将这些更改保存回zip文件夹的方法。

说我有一个zip文件夹,其中包含一些内容如下的文件:

  

test.zip/
  test1.txt#内容:这是一个测试1.
  test2.txt#内容:这是一个测试2。

运行脚本后,zip文件夹应该相同,但是具有新的文本文件内容:

  

test.zip/
  test1.txt#内容:这是一个测试1. Hello world。
  test2.txt#内容:这是一个测试2. Hello world。

0 个答案:

没有答案