用OBS Python SDK写大文件分片上传工具

举报
海是岛思念的泪 发表于 2026/08/29 08:58:28 2026/08/29
【摘要】 用 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 还提供控制台"分段上传任务管理"界面,能看到和清理没合并完的碎片,避免产生存储费用。

四、小结

分片上传就是把"一次大上传"拆成"很多小上传",稳定性一下就上来了。配合本地记录上传进度,断网也不怕。脚本里的 partSizeoffsetisFile=True 这几个参数是关键,照搬官方示例基本不会错。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。