gpt4 book ai didi

node.js - 尝试使用 API Gateway 和 Lambda 从 S3 提供图像文件会导致文件损坏

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:45 24 4
gpt4 key购买 nike

我创建了 AWS API Gateway 方法,该方法调用 Lambda 函数,该函数应将图像文件作为附件返回给用户。 API 网关方法设置为使用 Lambda 代理集成(请求被代理到 Lambda)。我的 Lambda 函数非常简单:

const aws = require('aws-sdk');
const s3 = new aws.S3();

exports.handler = async event => {
try {
const Bucket = event.xxx;
const Key = event.yyy;
const file = await s3.getObject({ Bucket, Key }).promise();

return {
body: file.Body.toString(),
headers: {
'Content-Disposition': `attachment; filename=test.jpg`,
'Content-Length': file.ContentLength,
'Content-Type': file.ContentType,
},
statusCode: 200,
};
} catch (e) {
console.error(e);
}
};

但是,通过这种方式下载的文件与原始文件的大小不同,并且已损坏。

例如,我尝试上传 81264 字节的文件,但下载的版本大小为 146650 字节。
检查来自 Lambda 的响应 header ,我发现 Content-Length 实际上是 67432 (即使它设置为 file.ContentLength ,即 81264),但还有一个自定义 header x-amzn-Remapped-Content-Length 显示正确的大小 (81264)。

我应该怎么做才能正确回复正确的文件?

最佳答案

这看起来与一般 API 网关设置有更多联系,首先在 API 设置中定义“二进制媒体类型”(例如 image/jpegapplication/pdf、等)并通过 "API Gateway Response Content Type Conversions" 来判断该请求还应该发送 Accept header 。

最后,我应该将 Body 转换为 base64,并添加 isBase64Encoded: true 到响应中,如下所示:

return {
body: file.Body.toString('base64'),
headers: {
'Content-Disposition': `attachment; filename=test.jpg`,
'Content-Length': file.ContentLength,
'Content-Type': file.ContentType,
},
statusCode: 200,
isBase64Encoded: true,
};

关于node.js - 尝试使用 API Gateway 和 Lambda 从 S3 提供图像文件会导致文件损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58259958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com