AWS API Gateway 和 Lambda 返回映像

假设我有这个HTML:

<img src="http://example.com/pic"/>

我想做的是将 example.com/pic 映射到 AWS API Gateway 终端节点。

然后,该终结点将调用 lambda 函数。

该 lambda 函数将从 s3 存储桶中读取随机图像并将其返回。

因此,我的目标是使用标准 HTML 图像标记,并最终获得来自 s3 存储桶的图像,但要通过 lambda 中的一些决策代码来决定要返回的图像。

我知道您可以使用s3直接提供静态内容(因此lambda可以决定什么图像)。我也知道我可以在lambda中做一些事情,比如b64编码响应,然后在客户端上处理它,但我的目标是使用标准的HTML IMG标签。

这可能吗?

我尝试将ReactStreamHandler(Java SDK)用于lambda并返回图像的字节数组,还添加了API网关配置以不将输出映射到JSON,但似乎没有任何效果!


答案 1

似乎AWS已经简化了这个过程,因此许多答案已经过时和/或过于复杂。

这就是我让 Lambda 通过 API 网关返回映像的方式,截至 2018 年 6 月:

1) 在 API 网关中,为您的 API 启用。(此设置位于“集成请求”部分,您已在其中将类型设置为 Lambda。Use Lambda Proxy integration

2) 在 API 网关 中,选择您的 API,然后单击 。在添加中。(注意:我尝试简单地添加“image / jpeg”,但似乎需要让所有这些工作都起作用)SettingsBinary Media Types*/**/*

3) 请务必部署 API,否则您的更改将不会生效。(在 API 网关 中,选择您的 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 中将 设置为 ,API Gateway 仍将返回文本(如果这是您的 Lambda 返回的文本)。Binary Media Types*/*


答案 2

幸运的是,现在 AWS API Gateway 支持二进制数据,但您还需要通过 CLI 更新资源方法,因为它尚未在控制台中实现。这是您需要做的:

  1. 方法的“方法响应
    ”中,设置为 HTTP 200 状态响应标头中Content-Typeimage/jpeg
  2. 在方法
    集成响应中,设置为标头映射中。注意报价!Content-Type'image/jpeg'
  3. 使用 AWS CLI,将属性设置为集成响应contentHandlingCONVERT_TO_BINARY

在这个伟大的分步指南中查看整个过程:https://stackoverflow.com/a/41434295/720665


推荐