很多小伙伴在使用 python requests 库时不知道怎么上传图片或其他文件,今天小编就带大家一步一个脚印,搞定各种文件上传。
预热知识
requests 库的基本使用
前面我们讲过 requests 库的使用,这里就不再介绍了,需要的小伙伴可以参考:5分钟入门一个python库——requests
文件上传编码类型
在文件上传时,所使用的编码类型是multipart/form-data
,属于表单数据,它既可以发送文本数据,也支持二进制数据上传,另外还有一种表单数据编码类型是application/x-www-form-urlencoded
,是表单数据向服务器提交时所采用的默认编码类型,这两者的区别是:
x-www-form-urlencoded: 会把表单数据转换成一个字串,如:
name1=value1&name2=value2...
![6e86f3943251f50fd23ee5c6af4be797.png](https://i-blog.csdnimg.cn/blog_migrate/5c1c74accaf9dd85d040b968e615156f.png)
multipart/form-data: 会把整个表单以控件为单位分割,并为每个部分加上:
Content-Disposition ( form-data 或者file ),
Content-Type(默认为text/plain),
name(控件名称)等信息,并加上分割符(boundary)
requests files 参数详解
files = {'file': open(r'001.jpg', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
上传文件时需要使用到 files
这个参数(必须是一个字典),才能使表单数据以 multipart/form-data
编码类型发送,我们在传 files
参数是可以有多种形式:
name: file-like-objects (不仅仅支持 open() 打开文件,还可以是其他的 IO 流)
files = {'file': open(r'001.jpg', 'rb')}
name: file-tuple
# file-tuple = ('filename', fileobj)
files = {'file': ('myfile.jpg', open(r'001.jpg', 'rb'))}
# or file-tuple = ('filename', fileobj, 'content_type')
files = {'file': ('myfile.jpg', open(r'001.jpg', 'rb'), 'image/jpeg')}
# or file-tuple = ('filename', fileobj, 'content_type', custom_headers)
files = {'file': ('myfile.jpg', open(r'001.jpg', 'rb'), 'image/jpeg', , {'Custom-Headers': '123456'})}
注意这里的
custom_headers
不会放到请求 headers 中去, 而是放每一个分隔块中
import requests
files = {'file': ('myfile.jpg', open(r'001.jpg', 'rb'), 'image/jpeg', , {'Custom-Headers': '123456'})}
response = requests.post('http://httpbin.org/post', files=files)
Content-Type: multipart/form-data; boundary=51dac4ba893e0423801fc2d08ea44f6f
--51dac4ba893e0423801fc2d08ea44f6f
Content-Disposition: form-data; name="file"; filename="myfile.jpg"
Content-Type: image/jpeg
Custom-Headers: 123456
其他案例
1. 下载文件并上传
download = requests.get('http://www.httpbin.org/image/jpeg')
files = {'file': ('myfile.jpg', download.content, 'image/jpeg')}
response = requests.post('http://httpbin.org/post', files=files}
2. 为文件添加 Mimetype
file_path = './001.jpg'
files = {'file': ('myfile.jpg', open(file_path, 'rb'), mimetypes.guess_type(image)[0])}
response = requests.post('http://httpbin.org/post', files=files}
>>>import mimetypes
>>>mimetypes.guess_type('./001.jpg')
('image/jpeg', None)
3. 既有 data 参数又有 files 参数
data = {'image_type': 1}
files = {'image_file': open(r'img.jpg', 'rb')}
response = requests.post('http://httpbin.org/post', data=data, files=files}
![13cacced680501c060d6c9479196cf2b.png](https://i-blog.csdnimg.cn/blog_migrate/728ecfed562858c6cfe342383762fc14.png)
4. 发送作为文件来接收的字符串
files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
response = requests.post('http://httpbin.org/post', files=files}
![dff757b0f35271a0f66a6a671a49d8d0.gif](https://i-blog.csdnimg.cn/blog_migrate/aceef73d7b5cde211c27d01199b5c734.gif)