使用JSZip压缩的文件比未压缩的内容更大。

6

有人能解释一下吗,为什么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/

从我的观察来看,该文件通常与未压缩的文件相同,并且根本没有进行压缩。


尝试使用更大且明显可压缩的值进行示例,例如 '11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111' 或者可能是那个值的20倍,看看是否会得到更小的值。zip有一些开销,未压缩的文件没有,对于非常短的示例,"压缩"文件实际上可能会更大。 - Patrick Fay
我试过了,它也不起作用,它返回的压缩文件大小与解压缩文件相同。我一定漏掉了什么(很可能是文档)。 - Pavol Travnik
1个回答

9
好的,我已经像你建议的那样查看了他们网站上的示例。我按照我的评论中提到的建议制作了一个明显可压缩的文件(并且你在之后跟进了),下载了一个100KB的未压缩文件。然后我使用Windows和7zip解压缩并重新压缩它,结果得到了一个约1KB的文件。你肯定是对的,jszip的示例创建了一个未压缩的zip文件。
对于他们网站上的情况,generate_async()默认不进行压缩,您必须像这样传递压缩选项,调整网站上的调用确实可以工作,就像这样:
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 我在那个问题上发表评论,建议他们更改示例以默认使用压缩来帮助避免这个问题。我没有为此创建单独的问题,但如果你对此感兴趣,可以这样做。


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