如何在 Google Cloud Function 中通过 HTTP 响应发送大文件

2023-12-26

我尝试了下面的代码,但Google Cloud Function的响应限制只有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你正在转移?

文档 https://cloud.google.com/functions/docs/writing/http#multipart_data:

注意:Cloud Functions 将 HTTP 请求正文大小限制为 10MB,因此任何大于此大小的请求都将在执行函数之前被拒绝。我们建议将大文件或超出单个请求的文件直接上传到 Cloud Storage

基于此,我将介绍一些压缩.csv通过增加Content-Encoding将文件与 gzip 压缩状态相互转换。如果是 .csv 文件,您应该获得良好的压缩率。

Content-Type: text/plain
Content-Encoding: gzip

如果您使用的是 Google Cloud Storage (GCS),您可以在 GCS 中阅读有关转码的更多信息文档 https://cloud.google.com/storage/docs/transcoding.

gzip 是一种数据压缩形式:它通常会减小文件的大小。与未压缩的情况相比,这允许更快地传输文件并使用更少的空间来存储文件。压缩文件可以降低成本和传输时间。在 Cloud Storage 中,转码是指在将文件提供给请求者之前自动更改文件的压缩方式。当转码导致文件变成 gzip 压缩时,可以将其视为压缩的,而当结果是不再是 gzip 压缩的文件时,则可以将其视为解压缩。 Cloud Storage 支持解压缩形式的转码。

网上还有一个很棒的资源Mozilla https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding关于设置标头以压缩和解压缩媒体值得一读的站点。

如果这对您不起作用,那么您唯一真正的选择是以某种方式对数据进行分块,或者在文件仍在 GCS 存储桶中时对其进行压缩。我已经取得了成功gzip压缩级别 https://linuxize.com/post/gzip-command-in-linux/#change-the-compression-level过去是为了减小文件大小。如果需要,可以使用另一个云功能来完成压缩。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Google Cloud Function 中通过 HTTP 响应发送大文件 的相关文章

随机推荐