Python中requests_toolbelt实现multipart/form-data文件上传

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)

花了半天时间,终于解决了问题。还是满欣慰的。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值