首页 > 解决方案 > 如何在 Google Cloud Function 中通过 HTTP 响应发送大文件

问题描述

我试过下面的代码,但谷歌云函数的响应限制只有 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);
}

标签: node.jsgoogle-cloud-functions

解决方案


您要转移的文件有多大.csv

文档

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

基于此,我将.csv通过添加Content-Encoding将文件转换为 gzip 压缩状态和从 gzip 压缩状态转换文件来引入一些压缩。如果它是 .csv 文件,您应该获得良好的压缩率。

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

如果您使用的是 Google Cloud Storage (GCS),您可以在 GCS文档中阅读有关转码的更多信息。

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

在Mozilla网站上还有一个非常好的资源,值得一读关于设置标题以压缩和解压缩媒体的内容。

如果这对您不起作用,那么您唯一真正的选择是以某种方式对数据进行分块或在文件仍在 GCS 存储桶中时对其进行压缩。gzip过去,我在压缩级别方面取得了成功,以减少文件大小。如果需要,可以使用另一个云功能来完成压缩。


推荐阅读