我有一堆数据作为文件存储在 Cloudflare 的 R2 上。我很早就注意到这些数据文件的存储桶大小接近太字节,因此应用了 brotli 压缩,将大小降至约 500mb。
我现在正尝试通过工作人员公开数据(以应用过滤器),但遇到了障碍。 Cloudflare 公开了具有 DecompressionStream 的 WebStreams,它可以解压缩 gzip,但不能解压缩 brotli。
我确实将流转换为 gzip ...
let stm = resp.body
.pipeThrough(new DecompressionStream("gzip"))
.pipeThrough(ApplyFilter(sDate, eDate))
.pipeThrough(new CompressionStream("gzip"))
;
Gzip 提供的压缩级别远不及我习惯的 Brotli。
261M 1158172.data (100%)
2.8M 1158172.data.gz ( 1%)
78K 1158172.data.br ( 0.03%)
那么,
更新
我忘了提及曾尝试转换为节点流并使用节点的
zlib.createBrotliDecompress
。不幸的是,Cloudflare 在工作人员中不支持
zlib
有针对网络流产品的 brotli 解压缩吗?
(de)CompressionStream 标准中不支持 Brotli,但您可以使用 WebAssembly 来实现。
如果客户端的有什么方法可以欺骗我的 Worker 或 R2 自动解压吗?
Uncaught Error: No such module "node:zlib".
标头未表明支持响应的
Accept-Encoding
标头中显示的内容,Cloudflare 将自行处理即时解压缩。
只需按原样返回压缩文件,并带有适当的
Content-Encoding
标头。
Content-Encoding
export default {
async fetch(req, env, ctx) {
const obj = await env.R2.get('result.br');
return new Response(obj.body, {
headers: {
'Content-Encoding': 'br'
},
encodeBody: 'manual'
});
},
};