Python中requests_toolbelt实现multipart/form-data文件上传
竟然有人把对外的APP接口中需要上传文件用Content-Type =multipart/form-data,来传文件,无语。在网上查了很长时间,通过requests包自己实现multipart/form-data,但是始终不成功,而且查到的都是同样的方法,根本没用。无耐自己尝试了requests_toolbelt包,成功了!
requests包中实现的方法:
这是requests包中,api.py文件给出的files的定义
根据requests包中的api.py文件提示的,拼凑出files的value
import requests
request_url = 'http://www.demo.com/studentInfo/saveNewInfo'
# 构造字典,键值对方式传参
request_data = {
'id': '9',
'name': '赵云',
'tel':'13212345678',
'school': '西南科技大学',
'major': '计算机',
'age': '30'
}
# 上传文件单独构造成以下形式
# 'img' 上传文件的键名
# 'demo' 上传到服务器的文件名,可以和上传的文件名不同
# open('D:/demo.jpg') 打开的文件对象,注意文件路径正确
# 'image/jpeg' Content-Type类型
request_file = {'img':(('demo',open('D:/demo.jpg')),'image/jpeg')}
requests.post(url=request_url, data=request_data, files=request_file) # url,data,files
但是用这个方法然并卵,respons始终提示,文件未上传。找不到原因,如果大神知道可以给出评论
requests_toolbelt
toolbelt文档
以下是文档中给的示例:
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
m = MultipartEncoder(
fields={'field0': 'value', 'field1': 'value',
'field2': ('filename', open('file.py', 'rb'), 'text/plain')}
)
r = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type})
然后我就依葫芦画瓢,我的实现代码:
params= {
"gender": 0,
"certType": 2,
"mobile": "12312",
"name": "venus",
"identityNumber": "420104"
}
m = MultipartEncoder(
{
"facePic": ('demo', open('C:/demo.jpg', 'rb'), 'image/jpeg')
}
)
header['Content-Type'] = m.content_type
client = HTTPClient(url=url, method='POST', headers=header)
resp = client.send(params=params, data=m)
print(resp.text)
花了半天时间,终于解决了问题。还是满欣慰的。