【问题标题】:Dynamically created JPG image using AWS Lambda service使用 AWS Lambda 服务动态创建的 JPG 图像
【发布时间】:2017-01-15 19:46:39
【问题描述】:

我正在尝试创建一个动态创建的图形作为 JPG 文件,我可以在 Alexa Skill 标准卡中使用它作为响应的一部分。以下代码在我的计算机上本地运行时创建一个 JPG 图像,当使用 URL 为“http://localhost:5000/image.jpg”的浏览器时。

from flask import send_file
from flask import Flask
from PIL import Image, ImageDraw
from io import BytesIO


app = Flask(__name__)
app.config['DEBUG'] = True


def serve_pil_image(pil_img):
    img_io = BytesIO()
    pil_img.save(img_io, 'JPEG', quality=70)
    img_io.seek(0)
    return send_file(img_io, mimetype='image/jpeg')

@app.route('/image.jpg')
def serve_img():
    size = (128,128)
    background = (128,128,55)
    xy = [(0,0),(10,10),(20,20),(30,12),(50,50),(70,9),(90,70)]

    img = Image.new('RGB',size,background)
    draw = ImageDraw.Draw(img)
    draw.line(xy, fill=128, width=5)
    return serve_pil_image(img)


if __name__ == '__main__':

    app.run(debug=True)

但是,当我使用 Zappa 将相同的代码部署到 AWS Lambda 服务时,我收到以下错误消息(来自 CloudWatch 日志):

An error occurred during JSON serialization of response: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte
Traceback (most recent call last):
File "/usr/lib64/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib64/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib64/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte

是否有一些配置选项可以解决此问题?目前还没有找到。

【问题讨论】:

  • 你在本地使用的是什么版本的 Python?
  • @dirn Python 2.7.10
  • 看来问题是AWS Api Gateway不支持二进制输出数据,见this link

标签: dynamic flask jpeg aws-lambda alexa


【解决方案1】:

Binary Support is finally here!你应该看看然后再试一次。

【讨论】:

    【解决方案2】:

    如果您想通过 API Gateway 提供二进制数据(在本例中为 Base64 图像),您需要进行以下设置:

    1. 在您方法的方法响应
      在 HTTP 200 状态响应中将 Content-Type 设置为 image/jpeg 页眉
    2. 在您方法的集成响应
      在标头映射中将Content-Type 设置为'image/jpeg'注意引号!
    3. 使用 AWS CLI,在您的集成响应中将 contentHandling 属性设置为 CONVERT_TO_BINARY

    在这个伟大的分步指南中检查整个过程:https://stackoverflow.com/a/41434295/720665
    (示例是 base64 编码的 png 图像,但其要点是相同的) p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-18
      • 2011-07-24
      • 2015-04-20
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2012-07-30
      • 2022-10-07
      相关资源
      最近更新 更多