6

我需要在 WebSQl 中存储大量文本,所以我决定用zip.js压缩文本 并存储压缩后的 Blob

从文档中,您可以按如下方式压缩 blob

function zipBlob(filename, blob, callback) {
   // use a zip.BlobWriter object to write zipped data into a Blob object
   zip.createWriter(new zip.BlobWriter("application/zip"), function(zipWriter) {
      // use a BlobReader object to read the data stored into blob variable
      zipWriter.add(filename, new zip.BlobReader(blob), function() {
         // close the writer and calls callback function
         zipWriter.close(callback);
      });
   }, onerror);
}

尽管这可行,但我不明白您为什么需要指定文件名。这真的有必要吗?而且,这个文件在压缩后总是被删除吗?

干杯

4

2 回答 2

3

在这里检查这个答案 - 它不需要文件名,我敢打赌它更容易使用。我已经尝试了很多 javascript 压缩/解压缩实现,并且受到诸如原始数据大小限制、整体速度、效率等问题的困扰。在javascript中找到一个好的压缩/解压缩实现是非常困难的,但幸运的是这个还没有让我失望(而且我已经使用了很多次):

在javascript中压缩一个blob

您当前的实现需要文件名,因为它试图与 zip 保持一致,以便您可以将其保存到例如桌面并使用您最喜欢的 zip 实用程序打开它。听起来您的挑战与我的非常相似,我需要从浏览器和服务器的本地存储中保存和恢复压缩项目。

于 2013-06-19T03:06:56.560 回答
2

根据此实现,文件名是必需的。如果您只是压缩数据,则没有必要,但 zip.js 构建 zip 文件,这些文件存储文件,这些文件必须具有文件名。

在您的原始示例中, zipWriter.add() 有效地将您的 blob 转换为一个新文件并将其添加到一个 zip 中——“filename”参数是您希望该新文件具有的名称。

下面是一个使用 zip.js 将多个 blob 添加到 zip 的示例,然后使用 FileSaver.js 下载它:

function zipBlob() {
    zip.createWriter(new zip.BlobWriter("application/zip"), function(writer) {
        files = ["abcd", "123"];
        var f = 0;

        function nextFile(f) {
            fblob = new Blob([files[f]], { type: "text/plain" });
            writer.add("file"+f, new zip.BlobReader(fblob), function() {
                // callback
                f++;
                if (f < files.length) {
                    nextFile(f);
                } else close();
            });
        }

        function close() {
            // close the writer
            writer.close(function(blob) {
                // save with FileSaver.js
                saveAs(blob, "example.zip");
            });
        }

        nextFile(f);

    }, onerror);
}
于 2015-04-20T03:02:45.093 回答