用OBS Python SDK写大文件分片上传工具
【摘要】 用 OBS Python SDK 的分段上传接口写脚本,把大文件切块上传,稳定且支持断点续传思路。
一、为什么要用分片上传
有次往 OBS 传一个 2GB 的视频备份,走到 80% 网络断了,整条重来。后来查文档才知道 OBS 支持"分段上传"(Multipart Upload),把大文件切成 5–10MB 的块分别传,哪块失败重传哪块就行。官方推荐超过 100MB 的文件就用这种方式。
二、准备工作
| 项目 | 说明 |
|---|---|
| 运行环境 | Python 3.7+ |
| SDK | esdk-obs-python(模块名 obs) |
| 凭证 | 华为云 AK/SK,以及桶对应的 Endpoint |
| 目标桶 | 已创建的桶,例如 bigfile-bucket |
三、操作步骤
3.1 安装 SDK
pip install esdk-obs-python
3.2 写分片上传脚本
核心就三步:initiateMultipartUpload 初始化任务 → 循环 uploadPart 上传每一段 → completeMultipartUpload 合并。下面这段改自华为云官方 CodeLabs 示例,可直接用:
import os
from obs import ObsClient, CompleteMultipartUploadRequest, CompletePart
ak = os.getenv("OBS_AK")
sk = os.getenv("OBS_SK")
server = "https://obs.cn-north-4.myhuaweicloud.com" # 换成你的桶所在区域 Endpoint
bucket = "bigfile-bucket"
object_key = "backup/video.mp4"
local_file = r"./video.mp4"
obs_client = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
# 1. 初始化分段上传,拿到 uploadId
resp = obs_client.initiateMultipartUpload(bucket, object_key, contentType="video/mp4")
upload_id = resp.body.uploadId
# 2. 逐段上传
part_size = 9 * 1024 * 1024 # 每块 9MB
part_num = 1
offset = 0
etags = {}
file_size = os.path.getsize(local_file)
with open(local_file, "rb") as f:
while offset < file_size:
size = min(part_size, file_size - offset)
r = obs_client.uploadPart(
bucket, object_key, part_num, upload_id,
local_file, isFile=True, partSize=size, offset=offset
)
etags[part_num] = r.body.etag
offset += size
part_num += 1
# 3. 合并段
parts = [CompletePart(i, etags[i]) for i in range(1, part_num)]
req = CompleteMultipartUploadRequest(parts=parts)
obs_client.completeMultipartUpload(bucket, object_key, upload_id, req)
print("上传完成:", object_key)
3.3 关于断点续传
上面是"从头传"的版本。真要做断点续传,思路是:把每段上传结果(partNum → etag)记到本地文件,中断后先调 listParts 查出已传的段,跳过它们只补传缺失的段,最后再合并。OBS 还提供控制台"分段上传任务管理"界面,能看到和清理没合并完的碎片,避免产生存储费用。
四、小结
分片上传就是把"一次大上传"拆成"很多小上传",稳定性一下就上来了。配合本地记录上传进度,断网也不怕。脚本里的 partSize、offset、isFile=True 这几个参数是关键,照搬官方示例基本不会错。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)