Node.js 如何在Google Cloud函数中通过HTTP响应发送大文件

Node.js 如何在Google Cloud函数中通过HTTP响应发送大文件,node.js,google-cloud-functions,Node.js,Google Cloud Functions,我尝试了下面的代码,但Google Cloud函数的响应限制仅为10M,但我想返回更大的文件: const csv=json2csv(仅限数据事务); response.setHeader( “内容处置”, “附件;文件名=transactions.csv” ); response.set(“内容类型”、“文本/csv”); 响应。状态(200)。发送(csv); 更新:感谢@Andrew,我对代码进行了第一次更新,我强制压缩,因为firebase云函数上的压缩中间件甚至依赖于用户代理头,我仍

我尝试了下面的代码,但Google Cloud函数的响应限制仅为10M,但我想返回更大的文件:

const csv=json2csv(仅限数据事务);
response.setHeader(
“内容处置”,
“附件;文件名=transactions.csv”
);
response.set(“内容类型”、“文本/csv”);
响应。状态(200)。发送(csv);
更新:感谢@Andrew,我对代码进行了第一次更新,我强制压缩,因为firebase云函数上的压缩中间件甚至依赖于用户代理头,我仍在努力寻找其他建议,以获得最佳结果,感谢大家

if(request.headers['content-type']='text/csv'){
const onlyDataTransactions=transactions.map(transaction=>transaction.toCsvRecord());
const csv=解析(仅数据事务);
response.setHeader(
“内容处置”,
“附件;文件名=transactions.csv”
);
response.set(“内容类型”、“文本/csv”);
set('Content-Encoding','gzip');
const content=await gzip(JSON.stringify(csv));
响应。状态(200)。发送(内容);
}

尝试使用流pipe()的方法。我希望它能解决这个问题

看看这个回购协议,它将帮助你解决这个问题


谷歌云功能与流媒体响应不兼容。我建议您查看一下(在Cloud Run中封装函数非常容易),然后查看。

您正在传输的
.csv
有多大

:

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

基于此,我将通过添加
内容编码
来将文件转换为gzip压缩状态,从而对
.csv
进行一些压缩。如果它是一个.csv文件,您应该可以获得很好的压缩率

Content-Type: text/plain
Content-Encoding: gzip
如果您使用的是谷歌云存储(GCS),您可以在GCS中阅读更多关于代码转换的信息

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

网站上还有一个很好的资源,值得一读关于设置头来压缩和解压缩媒体的内容


如果这对您不起作用,那么您唯一的实际选择就是以某种方式对数据进行分块,或者在文件仍在GCS存储桶中时对其进行压缩。我在过去成功地减少了文件大小。如果需要,可以使用另一个云函数进行压缩。

谢谢,我将尝试这种方法,并在这里发布代码和结果,但我认为10Mb的云函数限制将是一个问题。管道将与流一起工作。如果云带宽是10GB,你什么都做不了,但是你可以通过管道将数据作为一个块发送。请尝试并告诉我。谢谢Guillaume,我将学习如何使用Cloud Run并尽快在这里发布结果。谢谢,我没有考虑压缩,这是个好主意,我会这么做。我猜文件大小至少为30MB,因为这是一个事务历史文件,我想让用户下载几个月的事务。我更新了我的答案,因为我认为另一个选项是在下载之前压缩存储中的数据。嗨,安德鲁,我更新了问题,我使用节点gzip进行压缩,因为firebase云函数环境上的压缩中间件依赖于请求数据,甚至用户代理()和我想要强制压缩