用 Python 给华为云 OBS 写一个断点续传上传器:分片、校验与重试

举报
yd_219600272 发表于 2026/11/01 09:07:51 2026/11/01
【摘要】 一、为什么需要断点续传把几百 MB 的日志包或模型文件直接丢给普通上传接口,最大的问题不是速度,而是不可恢复:网络抖一下就从头再来。华为云 OBS 提供了分段上传(Multipart Upload)能力,把大文件切成固定大小的段分别上传,最后再合并成一个对象。只要把 uploadId 和每个分片的 ETag 持久化下来,进程被杀掉之后依然能接着传。二、环境准备与初始化依赖只有一个官方 SDK...

一、为什么需要断点续传

把几百 MB 的日志包或模型文件直接丢给普通上传接口,最大的问题不是速度,而是不可恢复:网络抖一下就从头再来。华为云 OBS 提供了分段上传(Multipart Upload)能力,把大文件切成固定大小的段分别上传,最后再合并成一个对象。只要把 uploadId 和每个分片的 ETag 持久化下来,进程被杀掉之后依然能接着传。

二、环境准备与初始化

依赖只有一个官方 SDK:pip install esdk-obs-python。初始化时把 AK/SK 放在环境变量里,代码中不要硬编码。客户端建议指定 endpoint 与 region,并打开长连接,这样连续上传多个分片时能省下大量 TLS 握手开销。如果 bucket 在别的区域,记得 endpoint 要和 bucket 所在区域一致,否则会报 301 重定向错误。

三、切片上传与进度记录

分段上传的第一步是调用 createMultipartUpload 拿到 uploadId,然后按 5MB 起步的分片大小循环调用 uploadPart。每上传成功一片,就把分片号、ETag 和字节范围写入本地的一个 JSON 断点文件,写文件时先写临时文件再改名,避免进程中断留下半个 JSON。进度条只需要读断点文件里已完成的字节数,不必依赖内存状态。

四、校验与失败重试

所有分片传完后调用 completeMultipartUpload,OBS 会按分片号顺序拼接。建议在上传前先算一遍文件的 CRC64 或 MD5,上传结束后用对象的 ETag 与元数据做一次比对,确认内容没有损坏。重试策略要区分错误类型:网络超时和 5xx 可以指数退避重试,4xx 特别是 403 通常是权限或签名问题,重试多少次都没用,应该直接抛出。

五、实测效果与小坑

用一个 1.2GB 的镜像包实测,千兆内网下总耗时和单次直传基本持平,但中途断网重连后只补传了缺失的两个分片,节省了将近九成的时间。踩过的坑有两个:一是分片号必须连续且从 1 开始,跳号会导致合并失败;二是未完成的分段上传会占用存储并计费,建议配一条生命周期规则自动清理超过七天的未完成分段上传。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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