我正在使用AWS Api Gateway,Lambda和S3。
我的目标是访问网关,并在浏览器中提供和显示S3存储桶中的图像。目前,我可以使用lambda中的AWS开发工具包从相应的存储桶中成功获取图像,这没有问题。然后,我通过电线发送它,响应为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作为一个附带说明,尽管上面的示例只是一个图像,但我通过该代码提供的不仅仅是图像。
答案 0 :(得分:0)
我能够找出解决问题的方法。感谢jarmod指出正确的方向。我首先必须为下图所示的AWS Gateway Settings中的所有内容启用Binary Media Types。
之后,我将lambda代码更改为:
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;