我试图创建一个动态创建的图形作为JPG文件,我可以在Alexa技能标准卡中使用作为响应的一部分。当我使用URL为"http://localhost:5000/image.jpg"的浏览器在我的计算机上本地运行它时,下面的代码创建了一个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
是否有一些配置选项来解决这个问题?
二进制支持终于来了!你应该看看,然后再试一次。
如果您想通过API Gateway提供二进制数据(在本例中为Base64图像),则需要设置以下内容:
- 在方法响应的方法
在"HTTP 200状态响应"中设置"Content-Type
"为"image/jpeg
"头 - 在方法的集成响应中
在"报头映射"中设置"Content-Type
"为"'image/jpeg'
"。注意引号! - 使用AWS命令行,在您的集成响应 中将
contentHandling
属性设置为CONVERT_TO_BINARY
查看整个过程在这个伟大的一步一步的指导:https://stackoverflow.com/a/41434295/720665
(示例用于base64编码的PNG图像,但其要点是相同的)