Python-大文件上传requests-toolbelt
一、简介
requests.post发送文件的方式是把所有文件读取内存中,再构建请求发送出去。当发送大文件时候(好几个G)就会导致内存不足OOM
默认使用的requests.post较难做到分段文件发送(大概思路:先计算原文件md5,再切分文件发送,到接收端组合再计算md5,较麻烦不推荐,可参考:Python之requests模块-大文件分片上传 - 酌三巡 - 博客园 (cnblogs.com))
一般情况,对于python语言,推荐使用requests_toolbelt实现,该库是边读文件到内存中,一边上传。当然其本质还是multipart/form-data 方式提交数据
二:使用方式
首先下载
pip install requests-toolbelt
使用代码:
import requests
from requests_toolbelt import MultipartEncoder
# 边读取文件边上传文件
m = MultipartEncoder(
fields={'name': 'logo.com', # 字段1
"age": '100', # 字段2
'file1': ('1.png', open('logo.png', 'rb'), 'image/png'), # 文件1
'file2': ('2.png', open('logo.png', 'rb'), 'image/png') # 文件2
}
)
r = requests.post('http://www.hangge.com/upload.php', data=m, headers={'Content-Type': m.content_type})
print(r.text)
三:进阶技巧
因为requests-toolbelt使用流来实现文件上传,所以可以根据目前已经读取的数据流实现上传进度监控
import requests
from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor
def my_callback(monitor):
progress = (monitor.bytes_read / monitor.len) * 100
print("\r 文件上传进度:%d%%(%d/%d)" % (progress, monitor.bytes_read, monitor.len), end=" ")
e = MultipartEncoder(
fields={'name': 'logo.com', # 参数1
"age": '100', # 参数2
'file1': ('1.png', open('logo.png', 'rb'), 'image/png'), # 文件1
'file2': ('2.png', open('logo.png', 'rb'), 'image/png') # 文件2
}
)
m = MultipartEncoderMonitor(e, my_callback)
r = requests.post('http://www.hangge.com/upload.php', data=m, headers={'Content-Type': m.content_type})
print(r.text)
运行效果如下: