You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:01:37