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

在AWS Lambda环境中无法通过FastAPI使用PIL打开接收的图片

解决AWS Lambda Docker容器中Pillow无法识别图片的问题

从你提供的日志对比能一眼看出核心问题:服务器端的图片二进制数据开头出现了\xef\xbf\xbd(UTF-8的替换字符,对应显示为�),这说明上传的二进制文件在Lambda运行时被错误地当成文本处理过,原始二进制数据遭到破坏,Pillow自然无法识别图片格式。

问题根源

本地用Uvicorn运行时,FastAPI直接处理请求,文件流保持原始二进制状态;但在Lambda+Mangum的环境中,请求转发过程中可能出现两种情况:

  • Mangum适配器在处理请求时已经读取过文件流内容,导致文件指针不在起始位置
  • 某些中间环节错误地对二进制流做了文本编码转换,破坏了原始图片数据

解决方案

你可以通过修改代码,绕开编码问题并确保读取完整的图片数据:

from fastapi import FastAPI, File, UploadFile
from PIL import Image
from mangum import Mangum
from io import BytesIO

app = FastAPI(docs_url=None, redoc_url=None)

@app.post("/", status_code=201)
async def main(image: UploadFile = File(...)):
    # 重置文件指针到起始位置,避免之前的读取导致数据不完整
    await image.seek(0)
    # 直接读取二进制内容,绕开可能的编码转换问题
    img_bytes = await image.read()
    # 用BytesIO包装二进制数据,供Pillow正常读取
    img = Image.open(BytesIO(img_bytes))
    
    # 这里可以添加你的图片处理逻辑
    # 示例:return {"width": img.width, "height": img.height}

handler = Mangum(app)

额外检查项

如果修改后仍然报错,建议检查Docker镜像是否安装了Pillow依赖的系统库:

  • 若使用Debian/Ubuntu基础镜像,需要安装图片处理依赖:
    RUN apt-get update && apt-get install -y --no-install-recommends libjpeg-dev zlib1g-dev && rm -rf /var/lib/apt/lists/*
    
  • 若使用Alpine基础镜像,需要安装对应依赖:
    RUN apk add --no-cache jpeg-dev zlib-dev
    RUN pip install pillow --no-cache-dir
    

这些系统库是Pillow识别PNG、JPG等格式的必要条件,缺失也可能导致图片识别失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:57:33