node.js - 如何在 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);
}
解决方案
您要转移的文件有多大.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
过去,我在压缩级别方面取得了成功,以减少文件大小。如果需要,可以使用另一个云功能来完成压缩。
推荐阅读
- node.js - Dialogflow 错误 webhook 节点 js facebook 聊天机器人
- ios - 如何使用 Swift 将坐标转换为地址
- uml - 如何从应用程序中获取用例图?
- c# - 遍历 XML 文档中的子节点
- macos - 我可以在 Mac 上将 Cmder 集成到 VS Code 中吗?
- google-sheets - 为列中的重复时间数据添加几秒钟以使其唯一
- sql-server - 使用关键字约束分配多个外键的快捷方式
- python - 将带有分隔符的数据框展平为变量
- excel - Debug.Print 未打印变量的正确值
- ios - 在 iPhone Xs 上使用更多内存的样式传输模型