FastAPI多文件上传POST接口报错Expected UploadFile received: <class str>求助
错误原因
你遇到的报错本质是requests传参规则使用错误:
- requests发送
multipart/form-data类型请求时,普通表单字段和上传文件必须分开传递,分别对应post方法的data参数和files参数,不能将文件对象塞到普通表单字典中,否则requests会将文件序列化为字符串,导致FastAPI无法识别为UploadFile类型。 - 你最后尝试的
files = [('files',(fi,open(fi,'rb'),'image/jpeg')) for fi in fis]结构本身符合多文件上传的参数要求,只是传参方式错误。
正确请求代码
import requests url = "你的接口实际访问地址" set_name = 'test' n_index = 4 fis = ['t0.jpg', 't1.jpg', 't2.jpg', 't3.jpg'] # 普通表单字段单独放入data参数 data = { "set_name": set_name, "n_index": n_index } # 多文件参数构造,每个元组第一个元素必须和接口定义的文件参数名一致 files = [ ("files", (fi, open(fi, "rb"), "image/jpeg")) for fi in fis ] # 分别传递data和files参数,不需要手动设置Content-Type请求头 resp = requests.post(url, data=data, files=files) print(resp.json()) # 请求完成后关闭文件句柄,避免资源泄漏 for item in files: item[1][1].close()
注意事项
- 多文件列表中每个元组的第一个元素必须和FastAPI接口定义的文件参数名完全匹配,你接口的参数名为
files,所以此处统一写为"files",不能用文件名作为键。 - 不要手动添加
Content-Type: multipart/form-data请求头,requests会自动生成带边界标识的请求头,手动设置会导致边界丢失,请求解析失败。 - 生产环境建议用
with上下文管理器打开文件,自动处理资源释放。
内容的提问来源于stack exchange,提问作者Py K
相关产品推荐
相关产品推荐

