使用Python requests在multipart/form-data中同时发送文件与表单数据
解决requests同时发送文件与表单数据(含文件数组)的问题
我太懂这种卡壳的挫败感了!明明单独发文件或表单都没问题,合在一起就报错,折腾几小时真的头大。别担心,我来给你捋捋几种靠谱的解决方案,包括文件数组的情况:
基础方案:同时发送单个文件+表单数据
其实requests本身就支持同时传data(表单)和files(文件)参数,关键是格式要正确。比如:
import requests url = "你的目标接口URL" form_data = { "username": "jobu1342", "description": "同时发送文件和表单" } # 单个文件:key要和后端要求的字段名一致 files = { "attachment": open("test.pdf", "rb") } # 更安全的写法:用with语句自动关闭文件 with open("test.pdf", "rb") as f: files = {"attachment": f} response = requests.post(url, data=form_data, files=files) print(response.status_code) print(response.text)
进阶:发送文件数组
如果需要传多个文件(数组形式),只需要把files改成列表格式,每个元素是元组,保持相同的key即可:
import requests url = "你的目标接口URL" form_data = { "batch_id": "12345", "note": "这是一批文件" } # 文件数组:每个元组的第一个元素是后端接收的字段名,第二个是文件对象 files = [ ("attachments", open("file1.jpg", "rb")), ("attachments", open("file2.txt", "rb")), ("attachments", open("file3.csv", "rb")) ] response = requests.post(url, data=form_data, files=files)
用requests_toolbelt的正确姿势
如果你试了toolbelt没成功,大概率是MultipartEncoder的用法不对。正确的做法是把表单数据和文件都放进encoder里,而不是分开传:
from requests_toolbelt.multipart.encoder import MultipartEncoder import requests url = "你的目标接口URL" # 构建MultipartEncoder,包含表单和文件 encoder = MultipartEncoder( fields={ "username": "jobu1342", "description": "用toolbelt发送混合数据", # 文件字段:元组格式是(文件名, 文件对象, 内容类型),可按需指定 "attachments": ("file1.jpg", open("file1.jpg", "rb"), "image/jpeg"), "attachments": ("file2.txt", open("file2.txt", "rb"), "text/plain") } ) # 请求头必须设置Content-Type为encoder的content_type response = requests.post(url, data=encoder, headers={"Content-Type": encoder.content_type})
常见坑点排查
- 后端接收的字段名一定要和你传的key完全一致(比如后端要
file你传attachment肯定不行) - 打开文件必须用
rb模式,避免编码问题 - 如果表单数据里有中文或特殊字符,确保编码正确(requests默认会处理,若有问题可手动指定编码)
- 检查文件路径是否正确,避免因文件找不到导致的隐性错误
内容的提问来源于stack exchange,提问作者jobu1342
相关产品推荐
相关产品推荐

