requests文件上传和表单参数
requests文件上传和表单参数
一般情况下文件上传使用files参数,表单使用data参数,某些情况下类型是multipart/form-data,通过postman工具请求成功,使用requests请求失败
是因为requests使用data参数时默认用application/x-www-form-urlencoded。
解决办法
- 使用files参数传递formdata类型的数据,它默认会处理成multipart/form-data。
None作为文件名会被识别为表单项
# files为字典
resp = requests.post('http://127.0.0.1:5001/api/form',
files={
'file': ('1.mp4', open('data/1.mp4', 'rb'), 'file'),
'params': (None, '{"a":"1"}')
})
# files为列表,可上传文件列表
resp = requests.post('http://127.0.0.1:5001/api/form',
files=[
('files[]', ('1.mp4', open('data/1.mp4', 'rb'), 'file')),
('files[]', ('2.mp4', open('data/1.mp4', 'rb'), 'file')),
('params', (None, '{"a":"1"}'))
])
- 使用requests_toolbelt
安装
pip install requests_toolbelt
使用
from requests_toolbelt import MultipartEncoder
data = MultipartEncoder(fields={
'file': ('1.mp4', open('data/1.mp4', 'rb'), 'file'),
'params': '{"a":"1"}'})
# 注意指定data的content_type
resp = requests.post('http://127.0.0.1:5001/api/form', data=data, headers={'Content-Type': data.content_type})