看起来 AWS 已经简化了这个过程,所以很多答案已经过时或过于复杂。
以下是我在 2018 年 6 月的方法,让 Lambda 通过 API 网关返回图像:
1)在 API Gateway 中,为您的 API 启用 Use Lambda Proxy integration
(此设置位于集成请求部分,您需要将类型设置为 Lambda)。
2)在 API Gateway 中,选择您的 API,然后单击 Settings
。在 Binary Media Types
中添加 */*
。(注意:我尝试添加简单的 'image/jpeg',但似乎需要 */*
才能使所有内容正常工作)
3)一定要部署您的 API,否则您的更改不会生效。(在 API Gateway 中,选择您的 API,然后选择操作 > 部署 API)。
4)在您的 Lambda 代码中,以 Base64 编码返回您的图像(以下是 C# 代码示例):
// set the Content-type header
// set to whichever image type you're returning
var headersDic = new Dictionary<string, string>();
headersDic.Add("Content-type", "image/jpeg");
// return the response object that APIGateway requires
return new APIGatewayProxyResponse
{
StatusCode = 200,
Headers = headersDic,
// return the image in Base64 encoding
Body = Convert.ToBase64String(...your image data...),
IsBase64Encoded = true
};
完成。
如果您已经设置了API不需要身份验证,只需将API链接输入到浏览器中,它就会显示图像。或者将API链接放入IMG
标签中。例如:<img src="https://asdf.execute-api.us-east-1.amazonaws.com/live/myapi" />
注意:即使在第2步中设置了Binary Media Types
为*/*
,如果您的Lambda返回的是文本,API Gateway仍然会返回文本。
*/*
是因为 APIG 要求接受头匹配,这很愚蠢。 因此客户端必须发送Accept: image/jpeg
以使二进制解码发生。因为 Chrome(所有浏览器?)发送Accept: */*
,所以这使得它起作用。 - Cory Mawhorter*/*
,以及让我们了解每次更改内容后需要部署API的信息! - MarcinisBase64Encoded
设置为true
似乎是使返回二进制数据的关键。这种魔法似乎就是这样实现的。 - Jochem Schulenklopper