我需要在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);
}
虽然这有效,但我不明白为什么需要指定文件名。这真的有必要吗?并且,压缩后是否始终删除此文件?
干杯
答案 0 :(得分:3)
在这里检查这个答案 - 它不需要文件名,我打赌它更容易使用。我已经尝试了很多javascript压缩/解压缩实现,并且受到诸如原始数据大小限制,整体速度,效率等问题的困扰。在javascript中找到一个好的压缩/解压缩实现是非常困难的,但幸好这个还没有让我失望(而且我已经使用了很多):
Compressing a blob in javascript
您目前的实现需要文件名,因为它试图与zip保持一致,以便您可以将其保存为例如桌面并使用您喜欢的zip实用程序打开它。听起来你的挑战与我的非常相似,我需要在浏览器和服务器上保存和恢复本地存储中的压缩项目。
答案 1 :(得分: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);
}