2016-03-04 178 views
0

说我有这样的HTML:AWS API网关和Lambda返回图像

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

我想什么做的是有example.com/pic映射到AWS API网关端点。

该端点将调用lambda函数。

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

所以我的目标是使用STANDARD HTML图像标签,并结束从s3存储桶中的图像,但要通过lambda中的某些决定代码来决定要返回的图像。

我知道你可以使用s3直接提供静态内容(因此lambda决定了什么图像)。我也知道我可以做lambda中的东西,比如b64编码响应,然后在客户端处理它,但我打算使用标准的HTML IMG标记。

这可能吗?

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

回答

2

只要是明确的,客户端要两个不同的要求:

  1. 第一个拿到HTML(包括图像URL)。
  2. 第二个从url中获取图像数据。

换句话说,图像数据未在HTML中内联。

根据这些知识,您可以按照您的建议使用Lambda(位于API网关之后)。 Lambda实现可以有一些逻辑来确定S3中存储的图像的url。但是,Lambda返回的是JSON数据而不是HTML(有一些解决方法,如return the html in a variable),这使事情变得更加棘手,特别是对于大型HTML页面。

我建议一个稍微不同的方法,因为只是接收图像标记不会让你远。我假设你会在HTML文档中嵌入图像标签,可能是使用JavaScript。然后,您可以让API网关/ Lambda请求返回带有图片网址的JSON文档,并让JavaScript使用新网址更新现有图片代码或为您生成代码。

0

目前不可能,因为您无法通过AWS API网关返回二进制数据。

为此,lambda函数需要将图像数据作为二进制blob和一些元信息(如图像内容类型)返回。然后,AWS API网关需要能够将其映射到HTTP响应。例如: -

拉姆达回报: { contentType: 'image/png', image: "encoded binary data" }

然后API网关将需要的contentType映射到响应的“内容类型”标题,并把图像数据与所述响应的体正确的编码和长度。

不幸的是,它现在不这样做。它只映射像application/json或application/xml这样的文本编码作为响应类型(它毕竟是为API设计的)。

使用ElasticBeanstalk您可以非常轻松地实现此目的,您可以更轻松地控制http响应。

4

我跑到类似的问题。如上所述,您目前无法直接从您的API网关端点以二进制格式返回图像,这对于浏览器正确显示它是必需的。

但是,我解决这个问题的方式是让API Gateway返回一个302重定向,指向S3中的正确文件。您可以让Lambda函数将url返回到该文件,稍后将该文件映射到API网关中的位置标题。浏览器将遵循重定向并正确显示图像。

有执行重定向几种方法,但我做了如下:

  • 拉姆达返回一个对象,象这样的目标图像:

    function handler(event, context) { 
        context.succeed({ 
         location: "https://[bucket-name].s3-eu-west-1.amazonaws.com/myimage.png" }); 
        }); 
    } 
    
  • 删除正常的“200 '来自API网关中的集成响应的方法响应状态。用“302”响应状态替换它,并添加“位置”报头映射到值“integration.response.body.location”

  • 302种状态添加到该方法的响应以及

+0

为我工作的唯一解决方案。 –

4

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

  1. 在HTTP 200状态响应 头的方法
    设置Content-Typeimage/jpeg方法响应
  2. 在你的方法的合并响应
    在标题映射中将Content-Type设置为'image/jpeg'注意引号!
  3. 有了AWS CLI,您的合并响应

检查这个伟大的一步一步的指导,在设定contentHandling属性CONVERT_TO_BINARY到全过程:https://stackoverflow.com/a/41434295/720665