通过POST请求向Flask端点发送图片与变量数据失败求助
解决Flask端点同时接收图片和变量的问题
问题根源分析
你最初遇到的AttributeError: 'int' object has no attribute 'read',是因为把普通整数变量var:0放到了files字典里——requests库会把files参数里的所有值都当作文件对象处理,尝试调用它们的read()方法,而整数类型显然没有这个方法,所以触发了报错。
后来改用json方式发送的尝试,又出现TypeError: Object of type BufferedReader is not JSON serializable,这是因为JSON无法序列化文件流对象(open(fl, 'rb')返回的BufferedReader),这种方式本身就不适合传输文件。
正确的解决方案
其实你只需要把文件放在files参数,普通变量放在data参数里分开传递,requests会自动把请求格式处理成multipart/form-data(和你用Postman发送的格式完全一致),完美匹配你现有的Flask接收代码。
修正后的发送代码
import requests # 用with语句安全管理文件流 with open(fl, 'rb') as image_file: # 单独定义文件参数 files = {'image': image_file} # 单独定义普通表单参数 data = {'var': 0} # 分别传入files和data参数发送请求 res = requests.post(url, files=files, data=data)
为什么这能行?
files参数专门用来传递文件流,requests会自动处理文件的编码和传输逻辑data参数用来传递普通表单字段,对应Flask端的request.form- 这种方式和Postman发送文件+表单参数的逻辑完全一致,所以能正常工作
验证你的接收端代码
你现有的Flask端点代码不需要任何修改,因为它已经正确处理了文件和表单参数:
from flask import request import numpy as np import cv2 as cv @app.route('/your-endpoint', methods=['POST']) def handle_request(): file = request.files['image'] f1 = file.read() f2 = np.fromstring(f1, np.uint8) f3 = cv.imdecode(f2, cv.IMREAD_COLOR) var = int(request.form.get('var')) # 后续处理逻辑... return "Success"
这样就能同时接收图片和整数变量,不会再出现任何错误了。
内容的提问来源于stack exchange,提问作者arush1836
相关产品推荐
相关产品推荐

