python分块上传

文章介绍了如何使用requests库进行大文件分块上传。关键在于设置stream=True读取文件流,使用iter_content方法按chunk_size分块,处理并发送数据,最后发送结束标记。另外,也可以使用requests-toolbelt的MultipartEncoder简化这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在使用 requests 库的时候,你需要使用 stream=True 参数来打开流,并且使用 .raw 属性来获取原始数据流。

 

 

然后,你可以使用 iter_content(chunk_size) 方法来迭代每一个数据块,并且发送给服务器。在这里,chunk_size 参数代表了每个数据块的大小。需要注意的是,对于 chunked 模式,chunk 的大小应该在每个 chunk 前面加上长度信息,例如 b'10\r\n' + chunk + b'\r\n'。

 

 

最后发送完整个数据块序列后,需要发送一个长度为 0 的 chunk,例如 b'0\r\n\r\n',来表示数据传输结束。

 

 

具体实现可以参考以下代码:

 

 

import requests

 

url = "http://example.com/upload"

filename = "video.mp4"

chunk_size = 1024 * 1024 # 每个数据块的大小为 1MB

 

with open(filename, "rb") as f:

    r = requests.post(url, data=f, stream=True)

    for chunk in r.raw.iter_content(chunk_size):

        # 对 chunk 做长度处理

        chunked_chunk = f"{len(chunk):X}\r\n".encode() + chunk + b"\r\n"

        # 发送 chunk

        requests.post(url, data=chunked_chunk)

    # 发送结束 chunk

    requests.post(url, data=b"0\r\n\r\n")

 

这个代码中,我们打开文件,使用 stream=True 参数发送一个 POST 请求,并且利用 iter_content(chunk_size) 方法分块迭代原始数据流。然后,我们对每个数据块做长度处理,加上长度信息,再发送给服务器。

 

 

需要注意的是,在每个 chunk 发送后,requests 库不会自动关闭请求,因此需要在 chunk 最后手动关闭请求。

 

 

此外,如果你不想太过繁琐的代码,可以使用 requests-toolbelt 库中的 MultipartEncoder 工具类。这个类可以方便地实现 chunked 传输。例如:

 

 

import requests

from requests_toolbelt import MultipartEncoder

 

url = "http://example.com/upload"

filename = "video.mp4"

 

with open(filename, "rb") as f:

    # 创建 MultipartEncoder 对象

    encoder = MultipartEncoder({"video": f}, boundary="my_boundary", chunked=True)

    # 发送 POST 请求,并将 encoder 传入 data 参数

    r = requests.post(url, data=encoder, headers={"Content-Type": encoder.content_type})

 

这个代码中,我们使用 MultipartEncoder 创建了一个 multipart/form-data 类型的请求,并且指定了分界符 my_boundary。使用 chunked=True 参数来打开 chunked 模式。最后,我们将 encoder 对象传入 POST 请求的 data 参数中,headers 中也指定了 Content-Type。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值