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

Flask服务接收CURL上传图片并使用PIL处理时出现AttributeError问题求助

Flask服务接收CURL上传图片并使用PIL处理时出现AttributeError问题求助

你好呀!我仔细看了你的问题,发现两个关键问题需要解决,先给你一步步梳理:

1. 最核心的AttributeError错误解析

日志里的AttributeError: 'Image' object has no attribute 'read',是因为你直接把PIL的Image对象传给了flask.send_file(),但这个方法要求传入的是带有read()方法的类文件对象(比如BytesIO、磁盘文件句柄),而PIL的Image对象并没有这个方法,所以触发了报错。

解决方案:将处理后的图片写入BytesIO缓冲区再返回

你需要先把处理好的PIL Image对象保存到BytesIO内存缓冲区里,然后将缓冲区的指针移到开头(否则读取时会从末尾开始,读不到内容),再传给send_file()。修改后的返回部分代码如下:

# 导入必要的模块(如果还没导的话)
import io

# ... 你的图像处理逻辑(转numpy、处理图片) ...

# 创建BytesIO缓冲区
image_buf = io.BytesIO()
# 将处理后的numpy数组转成PIL Image并保存到缓冲区,指定格式为JPEG
Image.fromarray(image_np).save(image_buf, format='JPEG')
# 将缓冲区指针移到起始位置
image_buf.seek(0)
# 传入缓冲区对象给send_file
return flask.send_file(image_buf, mimetype='image/jpeg')

2. 关于日志里的405错误

你看到的127.0.0.1 - - [10/Jul/2023 17:44:23] "POST / HTTP/1.1" 405 -,说明有请求打到了根路径/,但你只给/calibrate路由配置了POST方法,所以返回405(方法不允许)。

  • 先确认你的curl命令确实是访问/calibrate路径(你贴的curl命令是正确的,可能是测试时的小失误,比如服务重启后路由没生效?或者curl命令执行时打错了?)
  • 可以在服务启动后,先打印下路由信息,确认/calibrate的POST路由已经正确注册。

额外小建议

  • 处理图片前,可以先打印flask.request.files.get("image")的值,确认图片确实成功上传到服务端了。
  • 如果你的输入图片可能是PNG等其他格式,保存到缓冲区时可以根据原图片的格式来设置,或者统一转成JPEG(注意PNG带透明通道的话,转JPEG会丢失透明信息,可能需要先处理)。

备注:内容来源于stack exchange,提问作者VPB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 06:59:33