我正在使用AWS Api Gateway、Lambda和S3。
我的目标是进入网关,在浏览器中提供并显示我的S3存储桶中的图像。目前,我可以使用我的lambda中的AWS SDK从适当的存储桶中成功获取图像,没有问题。然后我通过网络as发送它,响应是200,我可以看到所有合适的标头。然而,图像被破坏了。
下面是我的lambda中的代码:
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
const bucketParams = {
Bucket: 'my-bucket',
Key: 'build/cat.jpg',
};
const bucket = await s3.getObject(bucketParams).promise();
const response = {
statusCode: 200,
body: Buffer.from(bucket.Body).toString(),
headers: {
'Accept-Ranges': 'bytes',
'Content-Length': bucket.ContentLength,
'Content-Type': bucket.ContentType,
'Last-Modified': bucket.LastModified,
'ETag': bucket.Etag,
}
};
return response;
};响应是200,一切正常,但我的图像在浏览器中似乎损坏了。以下是示例https://3bn2t9npbd.execute-api.us-east-1.amazonaws.com/dev/cat.jpg的uri
顺便说一句,通过这段代码,我提供的不仅仅是图片,上面的例子只是一张图片。
发布于 2020-09-11 06:57:41
我找到了解决我问题的办法。感谢jarmod为我指明了正确的方向。我首先必须在我的AWS网关设置中为所有内容启用二进制媒体类型,如下所示。

之后,我将lambda代码更改为response:
const bucket = await s3.getObject(bucketParams).promise();
const response = {
statusCode: 200,
body: Buffer.from(bucket.Body).toString("base64"),
headers: {
'Accept-Ranges': 'bytes',
'Content-Length': bucket.ContentLength,
'Content-Type': bucket.ContentType,
'Last-Modified': bucket.LastModified,
},
isBase64Encoded: true,
};
return response;https://stackoverflow.com/questions/63836880
复制相似问题