如何使用requests库向FastAPI编写的接口上传多个文件
问题根源
- requests库的
files参数不识别FastAPI的UploadFile对象,二者属于不同框架的类型,不能混用,这是第一次报错TypeError: 'UploadFile' object is not iterable的直接原因。 - 后续报错
400/422是因为提交的文件结构和参数名不符合FastAPI多文件上传的要求:FastAPI接口接收的多文件参数名为files,请求时所有上传文件的字段名必须和接口参数名一致,且结构要符合requests的编码要求。
正确的多文件上传客户端实现
import os import requests input_dir = "替换为你的本地文件目录路径" doc_list = os.listdir(input_dir) files = [] for doc in doc_list: file_path = os.path.join(input_dir, doc) # 跳过子目录,只处理文件 if not os.path.isfile(file_path): continue # 结构要求:(接口参数名, (文件名, 二进制读取的文件对象, [可选MIME类型])) files.append(("files", (doc, open(file_path, "rb")))) response = requests.post("http://127.0.0.1:8080/uploadfiles/", files=files) # 可选:打印结果验证 print(response.status_code) print(response.json()) # 手动关闭打开的文件对象,避免资源泄漏,也可以用with上下文管理优化 for item in files: item[1][1].close()
结构说明
requests的files参数传多文件时,每个元素为元组结构,第一个值固定为FastAPI接口定义的参数名files,第二个值是包含文件名、文件对象的子元组,FastAPI会自动将所有字段为files的上传文件聚合为List[UploadFile]类型传入接口函数。
如果需要明确指定文件的MIME类型,可以在子元组中加第三个参数,示例:
files.append(("files", (doc, open(file_path, "rb"), "application/pdf")))
内容的提问来源于stack exchange,提问作者Hari Krishnan
相关产品推荐
相关产品推荐

