JavaScript - 使用zip.js压缩Blob

7

我需要在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);
}

尽管这样做可以起到作用,但我不明白为什么需要指定一个文件名。这真的必要吗?而且,这个文件压缩后总是会被删除吗?
2个回答

3

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

在JavaScript中压缩Blob

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


非常好!虽然压缩效果不如zip.js,但仍是一个非常有趣的替代品!!谢谢 - Jeanluca Scaljeri
很高兴听到这可能是你的一个潜在替代品,Jeanluca。是的,有许多情况下,从压缩角度来看,zip肯定会比LZJB表现得更好。对于某些类型的数据,它将大致相当;然而,它是超级快速的,如果你是在浏览器端进行操作,速度通常至关重要。根据我的经验,开发人员使用起来也更容易。此外,如果需要,还有一些隐藏的base64编码/解码方法,我在发布的稍微修改过的版本中没有公开。 - Matt Mullens
Jeanluca,我在这里留个便条给你以防万一——那个链接里我的示例有个错别字,在顶部 fastcompressor 对象的声明后面缺少了一个分号。所以我只是想让你知道这件事。我已经在那里把它修复了。 - Matt Mullens

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);
}

1
除了使用fileSaver库保存Zip文件,JS中还有其他的方法吗?我在使用fileSaver saveAs时遇到了内容安全策略错误。 - aniltilanthe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接