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)

运行效果如下:

python怎么使用第三方库requests-toolbelt上传文件流

posted @ 2023-08-24 10:34  王寄鱼  阅读(905)  评论(0编辑  收藏  举报