转换后将 Uint8Array 保存到 gzip

问题描述 投票:0回答:2

我一直在寻找客户端将文件转换为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();
javascript gzip file-conversion uint8array
2个回答
0
投票

您并没有真正说出您的最终目标是什么,但我猜您想生成一个用户可以从浏览器下载的文件。使用 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>


0
投票

对于那些尝试 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);
© www.soinside.com 2019 - 2024. All rights reserved.