FastAPI+AWS Lambda+API Gateway返回图片失败问题求助
问题:FastAPI + AWS Lambda + API Gateway 返回PNG图片失败,返回JSON格式而非图片
在FastAPI、AWS Lambda与AWS API Gateway组合环境中,通过REST API返回Redis存储的PNG二进制图片时遇到异常:接口未直接返回可渲染的图片,而是返回JSON格式响应,导致前端无法正常显示图片。
当前核心代码
@app.get("/radar", tags=["radar"]) async def get_radar_tiles( dt: str = Query(...), x: int = Query(...), y: int = Query(...), z: int = Query(...), ): timestamp = datetime.strptime(dt, DATE_TIME_PARSING_FORMAT) target_key = f"{timestamp.strftime('%Y%m%d%H%M')}_{z}_{x}_{y}.png" return Response( content=base64.b64encode(redis.get(target_key)), media_type="image/png", headers={'isBase64Encoded': "True"} )
异常表现
按照AWS官方指南修改为Lambda代理格式的字典后,Lambda返回的响应为JSON结构(而非图片流):
{"headers":{"Content-Type":"image/png"},"statusCode":200,"body":"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAABFUlEQVR4nO3BMQEAAADCoPVP7WsIoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAMBPAABPO1TCQAAAABJRU5ErkJggg==","isBase64Encoded":true}
已配置API Gateway的二进制媒体类型,但Chrome调试器显示响应仍为JSON,无法渲染图片。
解决方案
1. 配置Mangum启用二进制媒体类型支持
Mangum作为FastAPI与Lambda的适配层,需明确指定二进制类型,才能正确将FastAPI的Response转换为Lambda可识别的图片响应格式:
# 替换原handler初始化代码 handler = Mangum(app, binary_types=["image/png"])
2. 简化FastAPI Response构造,避免手动编码
Redis返回的是原生二进制图片数据,直接传入Response即可,Mangum会自动处理Base64编码(配置binary_types后),无需手动调用base64.b64encode:
@app.get("/radar", tags=["radar"]) async def get_radar_tiles( dt: str = Query(...), x: int = Query(...), y: int = Query(...), z: int = Query(...), ): timestamp = datetime.strptime(dt, DATE_TIME_PARSING_FORMAT) target_key = f"{timestamp.strftime('%Y%m%d%H%M')}_{z}_{x}_{y}.png" image_data = redis.get(target_key) # 处理图片不存在的情况 if not image_data: return Response(status_code=404) return Response(content=image_data, media_type="image/png")
3. 确认API Gateway二进制配置并重新部署
- 进入API Gateway控制台,选择目标API的Settings页面
- 在Binary Media Types中添加
image/png(若未配置) - 必须重新部署API配置,否则修改不会生效
4. 避免Lambda代理格式与FastAPI Response冲突
若直接返回Lambda代理格式的字典,需严格遵循以下规则:
isBase64Encoded设为布尔值True(而非字符串)body为Base64编码后的字符串headers中的Content-Type必须为image/png
但更推荐使用FastAPI Response配合Mangum的binary_types配置,减少手动处理的出错概率。
5. 检查CORS配置一致性
确保FastAPI的CORSMiddleware与API Gateway的CORS配置无冲突,避免响应头被覆盖或篡改。当前代码中的CORS配置是合规的,若API Gateway也配置了CORS,需保持规则一致。
内容的提问来源于stack exchange,提问作者dl.meteo
相关产品推荐
相关产品推荐

