jszip中的压缩文件大于未压缩的内容

时间:2019-09-10 07:44:50

标签: javascript file compression jszip

有人可以解释一下jszip不压缩文件怎么可能吗?我正在尝试使用压缩,并且压缩的zip文件的大小大于内部未压缩文件的文件大小。我在做错什么吗?

var fs = require("fs");
var JSZip = require("jszip");

var zip = new JSZip();
zip.file('try.txt', 'Hello World ');

zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWriteStream('out.zip')).on('finish', function () {
    // JSZip generates a readable stream with a "end" event,
    // but is piped here in a writable stream which emits a "finish" event.
    console.log("out.zip written.");
});

下载示例时,我也在官方页面上看到了该问题。 https://stuk.github.io/jszip/

如我所见,该文件通常与未压缩的文件相同,并且根本不进行压缩。

1 个答案:

答案 0 :(得分:2)

好的,我按照您的建议看了他们网站上的示例。我做了一个明显可压缩的文件,就像我在评论中建议的那样(然后您继续进行),下载了一个100KB的文件,显然未压缩。然后,我将其解压缩,并使用Windows和7zip将其重新压缩,结果生成了〜1KB的文件。绝对正确,jszip自己的示例正在创建一个未压缩的zip。

对于他们网站上的情况,generate_async()在默认情况下不会压缩,您必须像这样pass compression options,并且调整他们网站上的通话确实有效,就像这样:

var zip = new JSZip();
zip.file("Hello.txt", "11111111 I had a bunch more 1s that I removed\n");
var img = zip.folder("images");
img.file("smile.gif", imgData, {base64: true});
zip.generateAsync({type:"blob",
    /* NOTE THESE ADDED COMPRESSION OPTIONS */
    /* deflate is the name of the compression algorithm used */
    compression: "DEFLATE",
    compressionOptions: {
         /* compression level ranges from 1 (best speed) to 9 (best compression) */
        level: 9
    }})
.then(function(content) {
    // see FileSaver.js
    saveAs(content, "example.zip");
});

类似地,对于您的通话,我相信添加类似的选项应该可以根据generateNodeStream()文档来解决此问题:

zip.generateNodeStream(
    {type:'nodebuffer',streamFiles:true,compression: "DEFLATE", compressionOptions: {level: 9}}
).pipe(fs.createWriteStream('out.zip')).on('finish', function () {
    // JSZip generates a readable stream with a "end" event,
    // but is piped here in a writable stream which emits a "finish" event.
    console.log("out.zip written.");
});

此外,您也不是第一个遇到此问题的人。以下是他们github上的另一个用户陷入了同样的陷阱:https://github.com/Stuk/jszip/issues/503我对该问题进行了评论,建议他们将示例更改为默认设置,以使用压缩来避免此问题。我没有为此单独提出问题,但是如果您对此充满热情,可以这样做。

相关问题