jszip 中的压缩文件比未压缩的内容大
Compressed file in jszip is bigger than uncompressed content
谁能解释一下,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/
正如我所见,该文件通常与未压缩文件相同,并且根本不进行压缩。
好的,我按照你的建议看了他们网站上的例子。我制作了一个明显可压缩的文件,就像我在评论中建议的那样(你跟进了),下载一个 100KB 的文件,显然是未压缩的。然后我将其解压缩并使用 windows 和 7zip 重新压缩,结果生成了一个 ~1KB 的文件。你绝对是对的,jszip自己的例子是创建一个未压缩的zip。
他们网站上的案例,generate_async()
doesn't compress by default, you have to 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 我对这个问题发表了评论,建议他们将示例更改为默认使用压缩来帮助避免此问题。我没有为它创建一个单独的问题,但如果你对它充满热情,你可以这样做。
谁能解释一下,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/
正如我所见,该文件通常与未压缩文件相同,并且根本不进行压缩。
好的,我按照你的建议看了他们网站上的例子。我制作了一个明显可压缩的文件,就像我在评论中建议的那样(你跟进了),下载一个 100KB 的文件,显然是未压缩的。然后我将其解压缩并使用 windows 和 7zip 重新压缩,结果生成了一个 ~1KB 的文件。你绝对是对的,jszip自己的例子是创建一个未压缩的zip。
他们网站上的案例,generate_async()
doesn't compress by default, you have to 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 我对这个问题发表了评论,建议他们将示例更改为默认使用压缩来帮助避免此问题。我没有为它创建一个单独的问题,但如果你对它充满热情,你可以这样做。