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

如何让AWS Lambda与API Gateway返回图片?

Lambda + API Gateway 返回图片及输入优化方案

问题背景

原本配置Lambda返回图片时,客户端必须手动base64解码响应内容才能加载图片;修改配置为*/*二进制媒体类型后,图片可以正常返回,但Lambda需要通过json.loads(base64.b64decode(event["body"]))["url"]才能获取输入URL,存在冗余操作。


正确配置方案(解决返回+输入双重问题)

1. Lambda函数代码优化

直接处理原始请求体,无需base64解码,同时保持正确的图片返回格式:

import requests
from PIL import Image
from io import BytesIO
import base64
import json

def lambda_handler(event, context):
    # 获取输入URL(根据请求方法选择方式)
    if event["httpMethod"] == "POST":
        # POST请求:直接解析原始JSON字符串
        request_body = json.loads(event["body"])
        image_url = request_body["url"]
    elif event["httpMethod"] == "GET":
        # GET请求:从查询参数获取
        image_url = event["queryStringParameters"]["url"]
    
    # 加载并处理图片
    response = requests.get(image_url)
    pil_image = Image.open(BytesIO(response.content))
    
    file_object = BytesIO()
    pil_image.save(file_object, format="JPEG", quality=95)
    image_str = base64.b64encode(file_object.getvalue()).decode("ascii")
    
    # 返回标准代理响应
    return {
        "isBase64Encoded": True,
        "statusCode": 200,
        "headers": {"Content-Type": "image/jpeg"},
        "body": image_str,
    }

2. API Gateway关键配置

  • 方法与集成:创建资源和对应方法(POST/GET均可),选择Lambda集成并开启Lambda代理集成
  • 二进制媒体类型:在API设置中仅添加需要的图片类型(如image/jpeg、image/png),不要用*/*
  • 无需修改方法响应:代理集成模式下,Lambda返回的headers会直接传递给客户端,无需在API Gateway中额外配置Content-Type

3. 客户端请求示例(无需解码响应)

POST请求:

import requests
from PIL import Image
from io import BytesIO

response = requests.post(API_URL, json={"url": IMAGE_URL})
pil_image = Image.open(BytesIO(response.content))
pil_image.show()

GET请求:

import requests
from PIL import Image
from io import BytesIO

response = requests.get(API_URL, params={"url": IMAGE_URL})
pil_image = Image.open(BytesIO(response.content))
pil_image.show()

问题根源解释

  1. 原始返回问题:之前添加image/jpeg二进制类型但仍需客户端解码,是因为代理集成模式下,方法响应的Content-Type配置无效,API Gateway仅通过Lambda返回的headers["Content-Type"]匹配二进制类型。
  2. 输入解码问题:设置*/*后,API Gateway会把所有请求(包括JSON)当作二进制处理,自动对请求体做base64编码;仅配置图片类型为二进制后,JSON请求(Content-Type为application/json)会被识别为非二进制,直接以原始字符串形式传给Lambda。

内容的提问来源于stack exchange,提问作者Vincent Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:18:12