我想使用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。