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
相关产品推荐
相关产品推荐

