我已经尝试了下面的代码,但谷歌云功能的响应限制只有10M,但我想返回更大的文件:
const csv = json2csv(onlyDataTransactions);
response.setHeader(
"Content-disposition",
"attachment; filename=transactions.csv"
);
response.set("Content-Type", "text/csv");
response.status(200).send(csv);
更新:感谢@Andrew我对代码进行了第一次更新,我强制压缩,因为firebase云功能上的压缩中间件甚至依赖于用户代理标头,我仍然在努力寻找其他建议,以找到最好的结果,感谢所有人。
if (request.headers['content-type'] === 'text/csv') {
const onlyDataTransactions = transactions.map(transaction => transaction.toCsvRecord());
const csv = parse(onlyDataTransactions);
response.setHeader(
"Content-disposition",
"attachment; filename=transactions.csv"
);
response.set("Content-Type", "text/csv");
response.set('Content-Encoding', 'gzip');
const content = await gzip(JSON.stringify(csv));
response.status(200).send(content);
}
您要转让的.csv
有多大?
文档:
注意:Cloud Functions限制HTTP请求主体大小为10MB,因此任何大于此的请求将在函数执行之前被拒绝。我们建议将大文件或超过单个请求的文件直接上传到云存储
基于此,我将引入.csv
的一些压缩,通过添加Content-Encoding
来将文件转换为gzip压缩状态。如果它是一个。csv文件,你应该得到一个很好的压缩率。
Content-Type: text/plain
Content-Encoding: gzip
如果你正在使用谷歌云存储(GCS),你可以在GCS文档中阅读更多关于转码的信息。
gzip是数据压缩的一种形式:它通常会减小文件的大小。这使得文件传输速度更快,并且比未压缩时使用更少的空间存储。压缩文件可以减少成本和传输时间。在云存储中,转码是在将文件提供给请求者之前自动更改文件的压缩。当转码导致文件被gzip压缩时,它可以被认为是压缩的,而当结果是一个不再被gzip压缩的文件时,它可以被认为是解压的。云存储支持解压缩形式的转码。
在Mozilla网站上还有一个很好的资源,关于设置标题来压缩和解压缩媒体,值得一读。
如果这对你不起作用,那么你唯一真正的选择就是以某种方式将数据块或压缩文件,而它仍然在GCS桶中。在过去,我已经成功地使用gzip
压缩级别来减小文件大小。如果需要,可以使用另一个云函数进行压缩。
Google Cloud Functions不兼容流响应。我建议你看看Cloud Run(它很容易在Cloud Run中包装一个函数),从而使用Cloud Run的流媒体容量。
尝试使用流的方法pipe()。我希望这能解决问题。
看看这个repo,它会帮助你解决这个问题。
https://github.com/dipbd1/ts-unicode-stream-throttle