如何让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()
问题根源解释
- 原始返回问题:之前添加
image/jpeg二进制类型但仍需客户端解码,是因为代理集成模式下,方法响应的Content-Type配置无效,API Gateway仅通过Lambda返回的headers["Content-Type"]匹配二进制类型。 - 输入解码问题:设置
*/*后,API Gateway会把所有请求(包括JSON)当作二进制处理,自动对请求体做base64编码;仅配置图片类型为二进制后,JSON请求(Content-Type为application/json)会被识别为非二进制,直接以原始字符串形式传给Lambda。
内容的提问来源于stack exchange,提问作者Vincent Garcia
相关产品推荐
相关产品推荐

