python http上传文件-python post文件上传
原文链接...
本文的multipart方法解决了我需要上传图片文件到服务器的问题
我们需要知道四种传输post请求body的方式。 首先,我们需要了解四种常见的编码方式:
HTTP协议规定POST提交的数据必须放在消息体(entity-body)中,但是协议并没有规定数据必须使用什么编码方式。 常见的四种编码方式如下:
♦1。 应用程序/x-www-form-urlencoded
这应该是最常见的POST方式提交数据了。 对于浏览器原生的form表单,如果不设置enctype属性,最终会以application/x-www-form-urlencoded的形式提交数据。 请求类似如下(本文省略无关请求头):
POST http://www.example.com HTTP/1.1 Content-Type:
application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
复制代码
♦2。 多部分/表单数据
除了传统的application/x-www-form-urlencoded形式外,我们经常使用的另一种形式是上传文件的形式。 这个表单的类型是 multipart/form-data。 这是另一种常见的POST数据提交方式。当我们使用表单上传文件时python http上传文件,必须让表单的enctyped等于这个值,下面是一个例子
接下来说一下发送post请求body的四种方式:
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
复制代码
♦3。 application/json application/json 这个作为响应头的Content-Type大家肯定不陌生。 事实上,现在越来越多的人将它作为请求头来告诉服务器消息体是一个序列化的JSON字符串。 由于JSON规范的流行,除了低版本的IE,所有主流浏览器都原生支持JSON.stringify,而且服务端语言也有处理JSON的函数,所以使用JSON不会遇到什么麻烦。
♦4。 text/xml 是一种以HTTP为传输协议,以XML为编码方式的远程调用规范。
发送post请求的body有四种方式:
(1)请求体为application/x-www-form-urlencoded
(2)请求体为multipart/form-data
(3) 请求体是原始的
(4) 请求体是二进制的
(1)请求体为application/x-www-form-urlencoded
形式:
1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'application/x-www-form-urlencoded'})
复制代码
♦Reqeusts支持以form形式发送post请求。 只需要将请求参数构造成字典,然后传递给requests.post()的data参数即可。
进入:
url = 'http://httpbin.org/post'
d = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=d)
print r.text
复制代码
输出:
{
“args”: {},
“data”: “”,
“files”: {},
“form”: {
“key1”: “value1”,
“key2”: “value2”
},
“headers”: {
……
“Content-Type”: “application/x-www-form-urlencoded”,
……
},
“json”: null,
……
}
复制代码
♦ 可以看到请求头中的Content-Type字段已经设置为application/x-www-form-urlencodedpython http上传文件,并且d = {'key1': 'value1', 'key2': 'value2'}表单提交给服务器,服务器返回的表单域就是提交的数据。
(2)请求体为multipart/form-data
除了传统的application/x-www-form-urlencoded形式外,我们经常使用的另一种形式是上传文件的形式。 这个表单的类型是 multipart/form-data。
形式:
1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'multipart/form-data'})
复制代码
♦ 需要在文件中发送数据(安装requests_toolbelt)
from requests_toolbelt import MultipartEncoder
import requests
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})
复制代码
♦无需文件
from requests_toolbelt import MultipartEncoder
import requests
m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'})
r = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type})
复制代码
(3) 请求体是原始的
形式:
♦传入xml格式文本
1 requests.post(url='',data='',headers={'Content-Type':'text/xml'})
♦传入json格式文本
1 requests.post(url='',data=json.dumps({'key1':'value1','key2':'value2'}),headers={'Content-Type':'application/json'})
复制代码
或者:
1 requests.post(url='',json={{'key1':'value1','key2':'value2'}},headers={'Content-Type':'application/json'})
复制代码
♦你可以将一个json字符串传递给requests.post()的数据参数,
进入:
url = 'http://httpbin.org/post'
s = json.dumps({'key1': 'value1', 'key2': 'value2'})
r = requests.post(url, data=s)
print r.text
复制代码
输出:
{
“args”: {},
“data”: “{\”key2\”: \”value2\”, \”key1\”: \”value1\”}”,
“files”: {},
“form”: {},
“headers”: {
……
“Content-Type”: “application/json”,
……
},
“json”: {
“key1”: “value1”,
“key2”: “value2”
},
……
}
复制代码
(4) 请求体是二进制的
形式:
1 requests.post(url='',files={'file':open('test.xls','rb')},headers={'Content-Type':'binary'})
复制代码
♦Requests 也支持以multipart 的形式发送post 请求,只需将一个文件传递给requests.post() 的files 参数即可。
进入:
url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print r.text
复制代码
输出:
{
“args”: {},
“data”: “”,
“files”: {
“file”: “Hello world!”
},
“form”: {},
“headers”: {……
“Content-Type”: “multipart/form-data; boundary=467e443f4c3d403c8559e2ebd009bf4a”,
……
},
“json”: null,
……
}
复制代码
♦文本文件report.txt 的内容只有一行:Hello world! 从请求的响应结果可以看出数据已经上传到服务器。
注意:一定要注意header的类型。