我一直在寻找客户端将文件转换为gzip(在浏览器中)并找到了pako。
事情是,我是通过使用服务器端的 Node.js 函数来进行此转换的运行示例(至少这是我从所读到的内容中对 Node.js 的理解)。
我想将“fs”(用于写入文件)和“buffer”(用于保存为可写入负责写入文件的新函数的格式)替换为一些本机javascript函数。
这是代码。
var pako = require('pako'), data = "sample text";
var fs = require('fs');
data = pako.gzip(data);
var buffer = new Buffer(data.length);
for (var i = 0; i < data.length; i++) {
buffer.writeUInt8(data[i], i);
}
var wstream = fs.createWriteStream('output.gz');
wstream.write(buffer);
wstream.end();
您并没有真正说出您的最终目标是什么,但我猜您想生成一个用户可以从浏览器下载的文件。使用 Blob API 很简单。以下内容基于(阅读:几乎相同)MDN 文档中的示例:
const data = 'sample text';
const gzipped = pako.gzip(data); // => Uint8Array
const blob = new Blob([gzipped], {type: 'application/gzip'});
const blobUrl = URL.createObjectURL(blob);
console.log('Generated Blob; object URL: %s', blobUrl);
// render link
const link = document.createElement('a');
link.setAttribute('href', blobUrl);
link.innerHTML = 'Download file';
document.body.appendChild(link);
<script src="https://unpkg.com/[email protected]/dist/pako_deflate.js"></script>
对于那些尝试 gzip
Uint8Array
的人来说,这里是适用于浏览器和浏览器兼容的服务器运行时的代码:
async function compressUint8Array(uint8Array) {
return new Uint8Array(await new Response(new Blob([uint8Array]).stream().pipeThrough(new CompressionStream('gzip'))).arrayBuffer());
}
async function decompressUint8Array(compressedUint8Array) {
return new Uint8Array(await new Response(new Blob([compressedUint8Array]).stream().pipeThrough(new DecompressionStream('gzip'))).arrayBuffer());
}
用途:
// Compression
const originalData = new Uint8Array([1, 2, 3, 4, 5]);
const compressedData = await compressUint8Array(originalData);
// Decompression
const decompressedData = await decompressUint8Array(compressedData);