现在所有主要的浏览器都支持解压缩流 API,但是我无法弄清楚如何在浏览器中使用fetch()
来解压缩gzip文件。
以下代码适用于base64字符串:
const decompress = async (url) => {
const ds = new DecompressionStream('gzip');
const response = await fetch(url);
const blob_in = await response.blob();
const stream_in = blob_in.stream().pipeThrough(ds);
const blob_out = await new Response(stream_in).blob();
return await blob_out.text();
};
decompress(
'data:application/octet-stream;base64,H4sIAAAAAAAAE/NIzcnJVyjPL8pJAQBSntaLCwAAAA=='
).then((result) => {
console.log(result);
});
gzip hello.txt
创建一个hello.txt.gz
文件(hello.txt
是一个包含内容"hello world"的纯文本文件),那么上面的函数会抛出一个错误。decompress('/hello.txt.gz').then((result) => {
console.log(result);
});
# FireFox
Failed to read data from the ReadableStream: “TypeError: The input data is corrupted: incorrect header check”.
Uncaught (in promise) DOMException: The operation was aborted.
# Chrome
Uncaught (in promise) TypeError: Failed to fetch
# Safari
[Error] Unhandled Promise Rejection: TypeError: TypeError: Failed to Decode Data.
[Error] Unhandled Promise Rejection: TypeError: Failed to Decode Data.
编辑
在Stackblitz上有一个可复制的演示。
.gz
扩展名让它以为它是自己的一种响应或类似的东西。将文件的扩展名改为.bin
,它就能正常工作。我真的不确定为什么服务器会这样行为,也不确定这是否只是StackBlitz的问题,还是默认配置的问题。我刚在我的本地主机(几乎是裸露的Apache配置)上尝试了一下,结果运行良好,所以这可能是一个StackBlitz的问题。 - Kaiido.gz
扩展名让它以为这是自己的响应之类的东西。将你的文件扩展名改为.bin
,就可以正常工作了。我真的不确定服务器为什么会这样行为,也不确定这是否只是一个stackblitz的问题,还是默认配置的问题。我在我的本地主机上尝试过(几乎是裸露的Apache配置),一切都正常,所以应该是stackblitz的问题。 - Kaiido.gz
扩展名让服务器误以为它是自己的响应之一,或者类似的情况。将文件扩展名更改为.bin
,它就能正常工作。我真的不确定服务器为什么会这样行为,也不确定这是否只是一个stackblitz的问题,还是默认配置的问题。我在我的本地主机上尝试过(几乎是最基本的apache配置),它能正常工作,所以这可能是一个stackblitz的问题。 - undefined