活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 产品能力
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      查看所有产品

      对象存储

      对象存储

      目录
        • 最新动态
        • 产品简介
        • 产品定义
        • 基本概念
        • 产品优势
        • 功能特性
        • 产品应用场景
        • 地域说明
        • 产品规格
        • 产品使用限制
        • 与其他服务的关系
        • 产品能力地图
        • 计费说明
        • 计费项
        • 存储费用
        • 流量费用
        • 请求费用
        • 数据取回费用
        • 计费模式
        • 按需计费
        • 包年包月(资源包)计费
        • 资源包概述
        • 资源包购买
        • 查看资源包详情
        • 资源包续订
        • 资源包退订
        • 查看消费明细
        • 欠费
        • 常见问题
        • 快速入门
        • 入门流程
        • 准备工作
        • 开通对象存储服务
        • 获取访问密钥(AK/SK)
        • 查询终端节点(Endpoint)
        • 用户配额
        • 工具下载及使用
        • 创建桶
        • 上传文件
        • 下载文件
        • 删除文件
        • 删除桶
        • 常用实践
        • 用户指南
        • 使用方式
        • 访问规则
        • 存储类别
        • 统计数据
        • 桶管理
        • 桶概述
        • 创建桶
        • 列举桶
        • 桶概览
        • 桶配额
        • 删除桶
        • 对象管理
        • 对象概述
        • 新建目录
        • 上传文件
        • 下载文件
        • 其他文件管理操作
        • 列举文件
        • 复制文件
        • 查看文件
        • 分享文件
        • 解冻归档文件
        • 删除
        • 删除文件
        • 恢复文件
        • 清理碎片
        • 数据管理
        • 生命周期管理
        • 桶清单
        • 数据访问
        • 数据回源
        • 域名管理
        • 数据安全
        • 服务端加密
        • 合规保留
        • 跨域访问设置
        • 多版本管理
        • 防盗链
        • 数据处理
        • 图片处理
        • 监控与日志
        • 监控
        • 日志管理
        • 控制台指南
        • 控制台功能概述
        • 入门操作
        • 入门流程
        • 开通对象存储服务
        • 资源包管理
        • 接入管理(VPC)
        • 创建桶
        • 上传文件
        • 下载文件
        • 删除文件
        • 删除桶
        • 桶管理
        • 创建桶
        • 列举桶
        • 桶概览
        • 搜索桶
        • 桶配额
        • 删除桶
        • 文件管理
        • 新建目录
        • 上传文件
        • 修改文件存储类型
        • 下载文件
        • 其他文件管理操作
        • 列举文件
        • 重命名文件
        • 搜索文件
        • 设置文件标签
        • 通过URL访问对象
        • 复制文件
        • 分享文件
        • 解冻归档文件
        • 删除
        • 删除文件
        • 恢复文件
        • 清理碎片
        • 权限管理
        • 读写权限
        • 桶的读写权限
        • 文件读写权限
        • IAM权限管理
        • 桶策略
        • STS临时授权
        • 桶ACL
        • 数据管理
        • 生命周期管理
        • 生命周期管理简介
        • 生命周期管理配置
        • 桶清单
        • 数据访问
        • 静态页面设置
        • 数据回源
        • 数据回源简介
        • 数据回源配置
        • 数据安全
        • 服务端加密
        • 合规保留
        • 跨域访问设置
        • 多版本管理
        • 对象多版本简介
        • 配置多版本
        • 跨区域复制
        • 防盗链
        • 对象存储迁移服务
        • 服务概览
        • 如何进行迁移前的评估
        • 如何进行对象存储迁移
        • 迁移常见问题及处理
        • 使用前常见问题
        • 使用常见问题
        • 迁移异常处理
        • 监控与日志
        • 监控
        • 日志管理简介
        • 日志管理配置
        • 数据处理指南
        • 图片处理
        • 图片处理概述
        • 使用方式
        • 图片处理参数
        • 图片缩放
        • 图片水印
        • 图片裁剪
        • 图片旋转
        • 格式转换
        • 信息获取
        • EXIF信息删除
        • 质量变换
        • 亮度变换
        • 渐进显示
        • 高斯模糊
        • 自适应方向
        • 获取平均色调
        • 锐化
        • 对比度
        • 内切圆
        • 圆角矩形
        • 索引切割
        • 图片连续处理
        • 图片持久化
        • SDK参考
        • 开发者文档
        • API参考
        • 调用前必知
        • 概述
        • 终端节点
        • 状态码
        • 错误码
        • API概览
        • 如何调用API
        • 构造请求
        • 认证鉴权
        • Python调用示例
        • Java调用示例
        • API
        • 对象存储整体操作
        • 对象存储服务开通
        • 查询ACCESS_KEY以及SECRECT_KEY
        • 资源池列表查询
        • 访问控制endpoint查询
        • 对象存储资源包询价
        • 查询对象存储开通状态
        • Bucket操作
        • 创建桶
        • 查询所有桶
        • 删除桶
        • 查询桶信息
        • 查询桶位置信息
        • 查询桶访问权限
        • 查询对象桶对象数量(不含碎片)
        • 查询对象桶碎片数量
        • 查询桶统计信息
        • Bucket进阶操作
        • 设置桶ACL
        • 获取桶ACL
        • 设置桶生命周期配置
        • 查询桶生命周期配置
        • 删除桶生命周期
        • 设置版本管理
        • 查询桶版本控制配置
        • 设置桶日志转存
        • 查询桶日志转存配置
        • 关闭日志转存
        • 创建跨域访问策略
        • 获取跨域访问策略
        • 删除跨域访问策略
        • 设置桶的合规保留配置
        • 获取桶的合规保留配置
        • 设置桶策略
        • 获取桶策略
        • 删除桶策略
        • 设置桶标签
        • 获取桶标签
        • 删除桶标签
        • 设置桶的加密配置
        • 获取桶的加密配置
        • 删除桶的加密配置
        • 修改桶配额
        • 设置桶的事件总线功能开关
        • Object操作
        • 查看对象列表
        • 查询桶内碎片列表
        • 删除对象
        • 创建文件夹
        • 删除文件夹
        • 查询对象版本信息
        • 设置对象ACL
        • 获取对象ACL
        • 设置对象标签
        • 查询对象标签
        • 删除对象标签
        • 设置对象保留期限配置
        • 获取对象保留期限配置
        • 复制对象
        • 批量删除对象
        • 生成对象共享链接/ 对象临时下载链接
        • 设置http头
        • 生成对象上传链接
        • 查询对象是否存在
        • 对象解冻
        • 对象修改存储类型
        • 分段操作
        • 列出上传对象的全部分段
        • 查询正在进行中的分段上传
        • 中止分段上传
        • 完成分段上传
        • 初始化分段上传
        • STS访问控制
        • 创建角色
        • 创建策略
        • 绑定角色策略
        • 查询角色列表
        • 查询角色详情
        • 删除角色
        • 查询策略列表
        • 修改策略
        • 删除策略
        • 查询策略详情
        • 解绑角色和策略
        • 对象存储迁移
        • 创建对象存储评估任务
        • 查询对象存储评估任务列表
        • 查询对象存储评估任务详情
        • 对象存储评估任务开始
        • 对象存储评估任务暂停
        • 对象存储评估任务恢复
        • 对象存储评估任务删除
        • 创建对象存储迁移任务
        • 查询对象存储迁移任务列表
        • 查询对象存储迁移任务详情
        • 查询迁移任务的失败对象列表
        • 对象存储迁移任务重试
        • 对象存储迁移任务暂停
        • 对象存储迁移任务恢复
        • 对象存储迁移任务删除
        • 最佳实践
        • 最佳实践汇总
        • 通过控制台访问对象存储ZOS
        • 云主机通过内网访问对象存储ZOS
        • 通过生命周期策略实现数据自动管理
        • 使用对象存储迁移服务将第三方云厂商数据迁移至对象存储ZOS
        • 修改文件读写权限
        • 数据一致性校验
        • 对象存储ZOS性能优化最佳实践
        • 通过云监控服务实时监控对象存储ZOS信息
        • 大文件分段上传
        • 解决浏览器跨域(CORS)问题的实践
        • 使用预签名URL直传对象存储
        • 获取对象文件的直接地址(下载链接)
        • 批量删除桶内对象
        • VPC内网中使用和公网相同的域名访问对象存储
        • 使用VPCE方式接入对象存储
        • 使用CDN加速访问对象存储ZOS
        • 常见问题
        • 热点问题
        • 售前常见问题
        • 计费常见问题
        • 存储桶常见问题
        • 对象(文件)常见问题
        • 视频专区
        • 相关协议
        • 中国电信天翼云对象存储服务协议
        • 中国电信天翼云对象存储服务等级协议
        • 常用工具
        • zosfs(预览版)
        • zosfs介绍及下载
        • zosfs使用限制
        • zosfs使用说明
        • iSCSI网关
        • NFS网关
        • 对象迁移工具
        • 文件上云迁移工具
        • S3Browser
        • zosutil
        • 自动化策略工具
        • 自助工具
        • 签名工具
        • SDK工具
        • 网络异常工具
        • 文件下载方式工具
        • 文档下载
          无相关产品

          本页目录

          前提条件

          环境配置

          分段上传

          操作场景

          操作步骤

          整体代码

          追加上传

          操作场景

          操作步骤

          整体代码

          断点续传

          操作场景

          操作步骤

          整体代码

          帮助中心 对象存储 最佳实践 大文件分段上传
          大文件分段上传
          更新时间 2024-10-20 23:51:31
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2024-10-20 23:51:31
          下载本页

          大文件分段上传

          2024-10-20 15:51:31

          前提条件

          • 开通对象存储服务。
          • 在天翼云对象存储控制台获取Access Key、Secret Key和外网访问控制的endpoint。
          • 安装Python环境,下载对应版本的ZOS官方Python SDK (本文以sdk_python3.X.tar为例),请参见开发者文档。

          环境配置

          • 解压sdk_python3.X.tar,在解压出的sdk文件夹下,打开cmd导入需要的包。
            pip3 install -r requirements.txt
            
          • 把sdk文件夹中的service-2.sns.sdk-extras.json和service-2.s3.sdk-extras.json文件放到“C:\Users\你的用户名.aws\models\s3\2006-03-01”文件夹(如果不存在该文件夹,可自行创建)下。

          分段上传

          操作场景

          • 大型文件上传:当需要上传大型文件时,使用分段上传可以更高效地完成任务。相比于一次性上传整个文件,分段上传允许在网络故障或其他原因导致上传中断时,只需要重新传输中断的片段,而不需要重新上传整个文件。
          • 网络不稳定环境:在网络连接不稳定或带宽有限的环境中,分段上传可以降低因网络中断或超时导致整个文件上传失败的风险。当上传过程中发生中断,只需要重新上传中断的片段,而不需要重新上传整个文件。
          • 文件大小不确定:可以在需要上传的文件大小还不确定的情况下开始上传,这种场景在视频监控等行业应用中比较常见。

          操作步骤

          1. 创建py文件,并引入boto3包的session模块。
            from boto3.sessionimport Session
            
          2. 配置用于访问对象存储服务的凭证Access Key、Secret Key和外网访问地址endpoint。
            access_key = "此处输入你的Access Key" # 这里输入你的Access Key
            secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
            url = "此处输入你的endpoint" # 这里输入你的endpoint
            
          3. 获取对象存储服务的操作客户端。
            session =Session(access_key, secret_key)
            s3_client =session.client('s3', endpoint_url=url)
            
          4. 开启分块上传,获取uploadID。
            # 在’’中填入要上传对象的桶名(必须已存在)和对象名。
            dict_cmp = s3_client.create_multipart_upload(Bucket='?', Key='?')
            uploadID = dict_cmp['UploadId'] # 记录uploadID,用于后续上传分块。
            
          5. 分块读取要上传的文件。
            # 设置列表,用于收集文件的所有分块
            chunks = []
            # 分块读取文件
            with open("此处输入你的文件地址", 'rb') as f:
                while True:
                  chunk = f.read(5 * 1024 * 1024) # 此处输入分块大小,本示例是5M,分块大小最低为5M
                  if not chunk:
                    break
                  chunks.append(chunk)
            
          6. 上传所有分块并记录各个分块的ETag和编号。
            # 设置列表,用于记录上传分块的ETag和编号。
            parts = []
            i = 0
            for chunk in chunks:
                i += 1
                # 上传分块
                dict_up = s3_client.upload_part(Bucket='?', Body=chunk,
                                                Key='?', PartNumber=i,
                                                UploadId=uploadID)
                # 记录该分块的ETag和编号
                part = {
                    'ETag': dict_up['ETag'],
                    'PartNumber': i,
                }
                parts.append(part)
            
          7. 完成所有分块的拼接,存入ZOS。
            # 完成所有分块拼接后,上传成功。
            s3_client.complete_multipart_upload(
                    Bucket='?',
                    Key='?',
                    MultipartUpload={
                        'Parts': parts
                    },
                    UploadId=uploadID,
                )
            

          整体代码

          from boto3.session import Session
          
          access_key = "此处输入你的Access Key" # 这里输入你的Access Key
          secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
          url = "此处输入你的endpoint" # 这里输入你的endpoint
          
          
          key = '?' # 传入桶内后的文件名
          bucketName = '?' # 要传入文件的桶名
          
          try:
              session = Session(access_key, secret_key)
              s3_client = session.client('s3', endpoint_url=url)
              # 开启分块上传,获取uploadID
              dict_cmp = s3_client.create_multipart_upload(Bucket=bucketName, Key=key)
              uploadID = dict_cmp['UploadId']#记录uploadID,用于后续上传分块。
          
              filePos = "此处输入文件路径"
              size = 5 * 1024 * 1024 #此处输入分块大小,本示例是5M,分块大小最低为5M
          
              # 设置列表,用于收集文件的所有分块
              chunks = []
              # 分块读取文件
              with open(filePos, 'rb') as f:
                  while True:
                      chunk = f.read(size)
                      if not chunk:
                          break
                      chunks.append(chunk)
              # 设置列表,用于收集上传分块的ETag和编号。
              parts = []
              i = 0
              for chunk in chunks:
                  i += 1
                  # 上传分块
                  dict_up = s3_client.upload_part(Bucket=bucketName, Body=chunk,
                                                  Key=key, PartNumber=i,
                                                  UploadId=uploadID)
                  # 记录该分块的ETag和编号
                  part = {
                      'ETag': dict_up['ETag'],
                      'PartNumber': i,
                  }
                  parts.append(part)
          
              # 完成整个拼接传入
              s3_client.complete_multipart_upload(
                  Bucket=bucketName,
                  Key=key,
                  MultipartUpload={
                      'Parts': parts
                  },
                  UploadId=uploadID,
              )
              print('文件上传成功!')
          except BaseException:
              print("上传异常,请检查各个参数后重试。")
          finally:
              # 关闭文件流
              f.close()
          
          

          追加上传

          操作场景

          通过普通上传创建的对象,用户无法在原对象上进行追加写操作,如果对象内容发生了改变,只能重新上传同名对象来进行修改。这在日志、视频监控等数据复写较频繁的场景下使用不方便。所以可以通过追加上传的方式来只上传增加部分的内容,增强扩展性,提高文件的上传效率。

          操作步骤

          1. 创建py文件,并引入boto3包的session模块。

            from boto3.sessionimport Session
            
          2. 配置用于访问对象存储服务的凭证Access Key、Secret Key和外网访问地址endpoint。

            access_key = "此处输入你的Access Key" # 这里输入你的Access Key
            secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
            url = "此处输入你的endpoint" # 这里输入你的endpoint
            
          3. 获取对象存储服务的操作客户端。

            session =Session(access_key, secret_key)
            s3_client =session.client('s3', endpoint_url=url)
            
          4. 读取文件并记录文件md5值。

            with open('输入要上传文件的路径', 'rb') as file:
                data = file.read()
                md5 = hashlib.md5(data).digest()
                md5 = base64.b64encode(md5)
            
          5. 上传对象。

            (1)首次上传

            s3_client.put_object(Bucket='输入要传入的桶名',
                                 Metadata=dict(m1='m1'),
                                 Body=data,
                                 Key='输入存入后对象的键值',
                                 ContentMD5=str(md5, 'utf-8'),
                                 Append=True,# 开启追加上传
                                 AppendPosition=0)# 指定追加上传开始的位置
            

            (2)追加上传

            # 获取需要追加上传的对象信息
            response = s3_client.head_object(Bucket="bucketblocks", 
                                             Key="mac.txt")
            # 获取当前对象长度
            appendPos = response['ContentLength']
            
            s3_client.put_object(Bucket='输入要传入的桶名',
                                 Metadata=dict(m1='m1'),
                                 Body=data,
                                 Key='输入存入后对象的键值',
                                 ContentMD5=str(md5, 'utf-8'),
                                 Append=True,# 开启追加上传
                                 AppendPosition=appendPos)# 指定追加上传开始的位置
            

          整体代码

          from boto3.session import Session
          import hashlib
          import base64
          
          access_key = "此处输入你的Access Key" # 这里输入你的Access Key
          secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
          url = "此处输入你的endpoint" # 这里输入你的endpoint
          
          # 上传文件桶的桶名
          bname = '输入要传入的桶名'
          # 文件在桶内存储的key值
          key = '输入存入后对象的键值'
          # 追加上传开始的位置,默认为0
          appendPos = 0
          
          try:
              # 读取文件并记录文件md5值
              with open('输入要上传文件的路径', 'rb') as file:
                  data = file.read()
                  md5 = hashlib.md5(data).digest()
                  md5 = base64.b64encode(md5)
              # 获取对象存储服务的操作客户端
              session = Session(access_key, secret_key)
              s3_client = session.client("s3", endpoint_url=url)
              # 获取桶内所有对象信息
              response = s3_client.list_objects(Bucket=bname)
              # 遍历所有对象键值
              for obj in response['Contents']:
                  # 桶中存在与待上传对象同key的对象,需要判断该对象能否进行追加上传
                  if obj['Key'] == key:
                      res = s3_client.head_object(Bucket=bname, Key=key)
                      if res['ResponseMetadata']['HTTPHeaders']['x-rgw-object-type'] != 'Appendable':
                          print('该对象不是Appendable类型,无法进行追加上传.')
                          raise Exception
                      #桶内对象可以进行追加上传,更新追加上传开始的位置
                      appendPos = res['ContentLength']
              # 完成追加上传
              s3_client.put_object(Bucket=bname,
                                   Metadata=dict(m1='m1'),
                                   Body=data,
                                   Key=key,
                                   ContentMD5=str(md5, 'utf-8'),
                                   Append=True,
                                   AppendPosition=appendPos)
              if appendPos == 0:
                  print('初次上传成功.')
              else:
                  print('追加上传成功.')
          
          except BaseException:
              print("参数有问题,请修改后重试.")
          finally:
              # 关闭文件流
              file.close()
          
          
          

          断点续传

          操作场景

          • 大文件上传:当需要上传大文件时,如视频、备份文件或软件包等,由于上传时间较长,在上传过程中可能会遇到各种问题,例如网络中断、上传工具崩溃或用户手动中断等。断点续传的操作场景允许用户在上传中断后,能够从中断点继续上传,而不需要重新上传整个文件。
          • 网络不稳定:在网络环境不稳定的情况下,如移动网络或低带宽连接,大文件的上传过程可能会中断或超时。通过断点续传,在宽带不稳定的情况下,上传仍可恢复并继续进行。
          • 长时间上传:某些上传任务可能需要较长的时间才能完成,这可能会增加上传过程中意外中断的风险。断点续传可以将上传任务分段处理,并保存上传进度信息,以便在上传中断后能够恢复并继续上传。
          • 客户端或服务端故障:在上传过程中,当客户端或服务端发生故障时,断点续传允许用户重新连接并从中断点继续上传,而不会对上传任务造成重大影响。

          操作步骤

          1. 创建py文件,并引入boto3包的session模块。
            from boto3.sessionimport Session
            
          2. 配置用于访问对象存储服务的凭证Access Key、Secret Key和外网访问地址endpoint。
            access_key = "此处输入你的Access Key" # 这里输入你的Access Key
            secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
            url = "此处输入你的endpoint" # 这里输入你的endpoint
            
          3. 获取对象存储服务的操作客户端。
            session =Session(access_key, secret_key)
            s3_client =session.client('s3', endpoint_url=url)
            
          4. 查询桶中还没有完成或放弃的分块上传,获取需要续传对象的UploadId和Key。
            response = s3_client.list_multipart_uploads(Bucket='输入对象传入的桶名')
            uploadInfo = response['Uploads']
            
          5. 根据上一步得到的UploadId和Key来获取当前对象已经上传完成的分段信息。
            response = s3_client.list_parts(Bucket='输入对象传入的桶名', Key='Key值',
                                     UploadId='UploadId值')
            finishedPartsInfo = response['Parts']
            # 设置列表,用于记录当前已经完成上传分块的编号。
            finishedPartNumbers = []
            # 记录分块的大小。
            partSize = 0
            # 设置列表,用于收集上传分块的ETag和编号。
            parts = []
            
            for finishedPart in finishedPartsInfo:
                finishedPartNumbers.append(finishedPart['PartNumber'])
                if partSize < finishedPart['Size']:
                    partSize = finishedPart['Size']
                part = {
                    'ETag': finishedPart['ETag'],
                    'PartNumber': finishedPart['PartNumber']
                }
                parts.append(part)
            
            
          6. 上传对象中未完成的分段,并记录各分段的ETag信息。
            # 设置列表,用于收集文件的所有分块
            chunks = []
            # 分块读取文件
            with open("此处输入你的文件地址", 'rb') as f:
                while True:
                    chunk = f.read(5*1024*1024)  # 此处输入分块大小,本示例是5M,分块大小最低为5M
                    if not chunk:
                        break
                    chunks.append(chunk)
            
            i = 0
            for chunk in chunks:
                i += 1
                # 当该分块已经完成上传时,跳过。
                if i in finishedPartNumbers:
                    continue
                # 上传分块
                response = s3_client.upload_part(Bucket=bucketName, Body=chunk,
                                                Key=key, PartNumber=i,
                                                UploadId='UploadId值')
                # 记录该分块的ETag和编号
                part = {
                    'ETag': response['ETag'],
                    'PartNumber': i,
                }
                parts.append(part)
            
          7. 完成所有分块的拼接,存入ZOS。
            # 完成所有分块拼接后,上传成功。
            s3_client.complete_multipart_upload(
                    Bucket=bucketName,
                    Key=key,
                    MultipartUpload={
                        'Parts': parts
                    },
                    UploadId=uploadID,
               )
            

          整体代码

          from boto3.session import Session
          
          access_key = "此处输入你的Access Key" # 这里输入你的Access Key
          secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
          url = "此处输入你的endpoint" # 这里输入你的endpoint
          
          bucketName = '?' # 要传入文件的桶名
          filePos = "?" # 待上传文件所在位置
          
          try:
              session = Session(access_key, secret_key)
              s3_client = session.client('s3', endpoint_url=url)
              # 查询桶中还没有完成或放弃的分块上传,获取需要续传对象的UploadId和Key。
              response = s3_client.list_multipart_uploads(Bucket=bucketName)
              uploadInfo = response['Uploads']
              if uploadInfo is None:
                  print(bucketName + '桶内没有需要断点上传的对象。')
                  raise BaseException
              # 获取需要续传的对象的UploadId和Key,这里以第一个对象为例
              uploadId = uploadInfo[0]['UploadId']
              key = uploadInfo[0]['Key']
          
              # 获取已经完成上传的分块信息
              response = s3_client.list_parts(Bucket=bucketName, Key=key, UploadId=uploadId)
              finishedPartsInfo = response['Parts']
              # 设置列表,用于记录当前已经完成上传分块的编号。
              finishedPartNumbers = []
              # 记录分块的大小。
              partSize = 0
              # 设置列表,用于收集上传分块的ETag和编号。
              parts = []
              for finishedPart in finishedPartsInfo:
                  finishedPartNumbers.append(finishedPart['PartNumber'])
                  if partSize < finishedPart['Size']:
                      partSize = finishedPart['Size']
                  part = {
                      'ETag': finishedPart['ETag'],
                      'PartNumber': finishedPart['PartNumber']
                  }
                  parts.append(part)
          
          
              # 设置列表,用于收集文件的所有分块
              chunks = []
              # 分块读取文件
              with open(filePos, 'rb') as f:
                  while True:
                      chunk = f.read(partSize)  # 此处输入分块大小,本示例是5M,分块大小最低为5M
                      if not chunk:
                          break
                      chunks.append(chunk)
          
              i = 0
              for chunk in chunks:
                  i += 1
                  # 当该分块已经完成上传时,跳过。
                  if i in finishedPartNumbers:
                      continue
                  # 上传分块
                  response = s3_client.upload_part(Bucket=bucketName, Body=chunk,
                                                   Key=key, PartNumber=i,
                                                   UploadId=uploadId)
                  # 记录该分块的ETag和编号
                  part = {
                      'ETag': response['ETag'],
                      'PartNumber': i,
                  }
                  parts.append(part)
          
              # 完成整个拼接传入
              s3_client.complete_multipart_upload(
                  Bucket=bucketName,
                  Key=key,
                  MultipartUpload={
                      'Parts': parts
                  },
                  UploadId=uploadId
              )
              print('文件上传成功!')
          except BaseException:
              print("上传异常,请检查各个参数后重试。")
          finally:
              f.close()
          
          
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          本文帮助您了解对象存储大文件分段上传的最佳实践。

          前提条件

          • 开通对象存储服务。
          • 在天翼云对象存储控制台获取Access Key、Secret Key和外网访问控制的endpoint。
          • 安装Python环境,下载对应版本的ZOS官方Python SDK (本文以sdk_python3.X.tar为例),请参见开发者文档。

          环境配置

          • 解压sdk_python3.X.tar,在解压出的sdk文件夹下,打开cmd导入需要的包。
            pip3 install -r requirements.txt
            
          • 把sdk文件夹中的service-2.sns.sdk-extras.json和service-2.s3.sdk-extras.json文件放到“C:\Users\你的用户名.aws\models\s3\2006-03-01”文件夹(如果不存在该文件夹,可自行创建)下。

          分段上传

          操作场景

          • 大型文件上传:当需要上传大型文件时,使用分段上传可以更高效地完成任务。相比于一次性上传整个文件,分段上传允许在网络故障或其他原因导致上传中断时,只需要重新传输中断的片段,而不需要重新上传整个文件。
          • 网络不稳定环境:在网络连接不稳定或带宽有限的环境中,分段上传可以降低因网络中断或超时导致整个文件上传失败的风险。当上传过程中发生中断,只需要重新上传中断的片段,而不需要重新上传整个文件。
          • 文件大小不确定:可以在需要上传的文件大小还不确定的情况下开始上传,这种场景在视频监控等行业应用中比较常见。

          操作步骤

          1. 创建py文件,并引入boto3包的session模块。
            from boto3.sessionimport Session
            
          2. 配置用于访问对象存储服务的凭证Access Key、Secret Key和外网访问地址endpoint。
            access_key = "此处输入你的Access Key" # 这里输入你的Access Key
            secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
            url = "此处输入你的endpoint" # 这里输入你的endpoint
            
          3. 获取对象存储服务的操作客户端。
            session =Session(access_key, secret_key)
            s3_client =session.client('s3', endpoint_url=url)
            
          4. 开启分块上传,获取uploadID。
            # 在’’中填入要上传对象的桶名(必须已存在)和对象名。
            dict_cmp = s3_client.create_multipart_upload(Bucket='?', Key='?')
            uploadID = dict_cmp['UploadId'] # 记录uploadID,用于后续上传分块。
            
          5. 分块读取要上传的文件。
            # 设置列表,用于收集文件的所有分块
            chunks = []
            # 分块读取文件
            with open("此处输入你的文件地址", 'rb') as f:
                while True:
                  chunk = f.read(5 * 1024 * 1024) # 此处输入分块大小,本示例是5M,分块大小最低为5M
                  if not chunk:
                    break
                  chunks.append(chunk)
            
          6. 上传所有分块并记录各个分块的ETag和编号。
            # 设置列表,用于记录上传分块的ETag和编号。
            parts = []
            i = 0
            for chunk in chunks:
                i += 1
                # 上传分块
                dict_up = s3_client.upload_part(Bucket='?', Body=chunk,
                                                Key='?', PartNumber=i,
                                                UploadId=uploadID)
                # 记录该分块的ETag和编号
                part = {
                    'ETag': dict_up['ETag'],
                    'PartNumber': i,
                }
                parts.append(part)
            
          7. 完成所有分块的拼接,存入ZOS。
            # 完成所有分块拼接后,上传成功。
            s3_client.complete_multipart_upload(
                    Bucket='?',
                    Key='?',
                    MultipartUpload={
                        'Parts': parts
                    },
                    UploadId=uploadID,
                )
            

          整体代码

          from boto3.session import Session
          
          access_key = "此处输入你的Access Key" # 这里输入你的Access Key
          secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
          url = "此处输入你的endpoint" # 这里输入你的endpoint
          
          
          key = '?' # 传入桶内后的文件名
          bucketName = '?' # 要传入文件的桶名
          
          try:
              session = Session(access_key, secret_key)
              s3_client = session.client('s3', endpoint_url=url)
              # 开启分块上传,获取uploadID
              dict_cmp = s3_client.create_multipart_upload(Bucket=bucketName, Key=key)
              uploadID = dict_cmp['UploadId']#记录uploadID,用于后续上传分块。
          
              filePos = "此处输入文件路径"
              size = 5 * 1024 * 1024 #此处输入分块大小,本示例是5M,分块大小最低为5M
          
              # 设置列表,用于收集文件的所有分块
              chunks = []
              # 分块读取文件
              with open(filePos, 'rb') as f:
                  while True:
                      chunk = f.read(size)
                      if not chunk:
                          break
                      chunks.append(chunk)
              # 设置列表,用于收集上传分块的ETag和编号。
              parts = []
              i = 0
              for chunk in chunks:
                  i += 1
                  # 上传分块
                  dict_up = s3_client.upload_part(Bucket=bucketName, Body=chunk,
                                                  Key=key, PartNumber=i,
                                                  UploadId=uploadID)
                  # 记录该分块的ETag和编号
                  part = {
                      'ETag': dict_up['ETag'],
                      'PartNumber': i,
                  }
                  parts.append(part)
          
              # 完成整个拼接传入
              s3_client.complete_multipart_upload(
                  Bucket=bucketName,
                  Key=key,
                  MultipartUpload={
                      'Parts': parts
                  },
                  UploadId=uploadID,
              )
              print('文件上传成功!')
          except BaseException:
              print("上传异常,请检查各个参数后重试。")
          finally:
              # 关闭文件流
              f.close()
          
          

          追加上传

          操作场景

          通过普通上传创建的对象,用户无法在原对象上进行追加写操作,如果对象内容发生了改变,只能重新上传同名对象来进行修改。这在日志、视频监控等数据复写较频繁的场景下使用不方便。所以可以通过追加上传的方式来只上传增加部分的内容,增强扩展性,提高文件的上传效率。

          操作步骤

          1. 创建py文件,并引入boto3包的session模块。

            from boto3.sessionimport Session
            
          2. 配置用于访问对象存储服务的凭证Access Key、Secret Key和外网访问地址endpoint。

            access_key = "此处输入你的Access Key" # 这里输入你的Access Key
            secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
            url = "此处输入你的endpoint" # 这里输入你的endpoint
            
          3. 获取对象存储服务的操作客户端。

            session =Session(access_key, secret_key)
            s3_client =session.client('s3', endpoint_url=url)
            
          4. 读取文件并记录文件md5值。

            with open('输入要上传文件的路径', 'rb') as file:
                data = file.read()
                md5 = hashlib.md5(data).digest()
                md5 = base64.b64encode(md5)
            
          5. 上传对象。

            (1)首次上传

            s3_client.put_object(Bucket='输入要传入的桶名',
                                 Metadata=dict(m1='m1'),
                                 Body=data,
                                 Key='输入存入后对象的键值',
                                 ContentMD5=str(md5, 'utf-8'),
                                 Append=True,# 开启追加上传
                                 AppendPosition=0)# 指定追加上传开始的位置
            

            (2)追加上传

            # 获取需要追加上传的对象信息
            response = s3_client.head_object(Bucket="bucketblocks", 
                                             Key="mac.txt")
            # 获取当前对象长度
            appendPos = response['ContentLength']
            
            s3_client.put_object(Bucket='输入要传入的桶名',
                                 Metadata=dict(m1='m1'),
                                 Body=data,
                                 Key='输入存入后对象的键值',
                                 ContentMD5=str(md5, 'utf-8'),
                                 Append=True,# 开启追加上传
                                 AppendPosition=appendPos)# 指定追加上传开始的位置
            

          整体代码

          from boto3.session import Session
          import hashlib
          import base64
          
          access_key = "此处输入你的Access Key" # 这里输入你的Access Key
          secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
          url = "此处输入你的endpoint" # 这里输入你的endpoint
          
          # 上传文件桶的桶名
          bname = '输入要传入的桶名'
          # 文件在桶内存储的key值
          key = '输入存入后对象的键值'
          # 追加上传开始的位置,默认为0
          appendPos = 0
          
          try:
              # 读取文件并记录文件md5值
              with open('输入要上传文件的路径', 'rb') as file:
                  data = file.read()
                  md5 = hashlib.md5(data).digest()
                  md5 = base64.b64encode(md5)
              # 获取对象存储服务的操作客户端
              session = Session(access_key, secret_key)
              s3_client = session.client("s3", endpoint_url=url)
              # 获取桶内所有对象信息
              response = s3_client.list_objects(Bucket=bname)
              # 遍历所有对象键值
              for obj in response['Contents']:
                  # 桶中存在与待上传对象同key的对象,需要判断该对象能否进行追加上传
                  if obj['Key'] == key:
                      res = s3_client.head_object(Bucket=bname, Key=key)
                      if res['ResponseMetadata']['HTTPHeaders']['x-rgw-object-type'] != 'Appendable':
                          print('该对象不是Appendable类型,无法进行追加上传.')
                          raise Exception
                      #桶内对象可以进行追加上传,更新追加上传开始的位置
                      appendPos = res['ContentLength']
              # 完成追加上传
              s3_client.put_object(Bucket=bname,
                                   Metadata=dict(m1='m1'),
                                   Body=data,
                                   Key=key,
                                   ContentMD5=str(md5, 'utf-8'),
                                   Append=True,
                                   AppendPosition=appendPos)
              if appendPos == 0:
                  print('初次上传成功.')
              else:
                  print('追加上传成功.')
          
          except BaseException:
              print("参数有问题,请修改后重试.")
          finally:
              # 关闭文件流
              file.close()
          
          
          

          断点续传

          操作场景

          • 大文件上传:当需要上传大文件时,如视频、备份文件或软件包等,由于上传时间较长,在上传过程中可能会遇到各种问题,例如网络中断、上传工具崩溃或用户手动中断等。断点续传的操作场景允许用户在上传中断后,能够从中断点继续上传,而不需要重新上传整个文件。
          • 网络不稳定:在网络环境不稳定的情况下,如移动网络或低带宽连接,大文件的上传过程可能会中断或超时。通过断点续传,在宽带不稳定的情况下,上传仍可恢复并继续进行。
          • 长时间上传:某些上传任务可能需要较长的时间才能完成,这可能会增加上传过程中意外中断的风险。断点续传可以将上传任务分段处理,并保存上传进度信息,以便在上传中断后能够恢复并继续上传。
          • 客户端或服务端故障:在上传过程中,当客户端或服务端发生故障时,断点续传允许用户重新连接并从中断点继续上传,而不会对上传任务造成重大影响。

          操作步骤

          1. 创建py文件,并引入boto3包的session模块。
            from boto3.sessionimport Session
            
          2. 配置用于访问对象存储服务的凭证Access Key、Secret Key和外网访问地址endpoint。
            access_key = "此处输入你的Access Key" # 这里输入你的Access Key
            secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
            url = "此处输入你的endpoint" # 这里输入你的endpoint
            
          3. 获取对象存储服务的操作客户端。
            session =Session(access_key, secret_key)
            s3_client =session.client('s3', endpoint_url=url)
            
          4. 查询桶中还没有完成或放弃的分块上传,获取需要续传对象的UploadId和Key。
            response = s3_client.list_multipart_uploads(Bucket='输入对象传入的桶名')
            uploadInfo = response['Uploads']
            
          5. 根据上一步得到的UploadId和Key来获取当前对象已经上传完成的分段信息。
            response = s3_client.list_parts(Bucket='输入对象传入的桶名', Key='Key值',
                                     UploadId='UploadId值')
            finishedPartsInfo = response['Parts']
            # 设置列表,用于记录当前已经完成上传分块的编号。
            finishedPartNumbers = []
            # 记录分块的大小。
            partSize = 0
            # 设置列表,用于收集上传分块的ETag和编号。
            parts = []
            
            for finishedPart in finishedPartsInfo:
                finishedPartNumbers.append(finishedPart['PartNumber'])
                if partSize < finishedPart['Size']:
                    partSize = finishedPart['Size']
                part = {
                    'ETag': finishedPart['ETag'],
                    'PartNumber': finishedPart['PartNumber']
                }
                parts.append(part)
            
            
          6. 上传对象中未完成的分段,并记录各分段的ETag信息。
            # 设置列表,用于收集文件的所有分块
            chunks = []
            # 分块读取文件
            with open("此处输入你的文件地址", 'rb') as f:
                while True:
                    chunk = f.read(5*1024*1024)  # 此处输入分块大小,本示例是5M,分块大小最低为5M
                    if not chunk:
                        break
                    chunks.append(chunk)
            
            i = 0
            for chunk in chunks:
                i += 1
                # 当该分块已经完成上传时,跳过。
                if i in finishedPartNumbers:
                    continue
                # 上传分块
                response = s3_client.upload_part(Bucket=bucketName, Body=chunk,
                                                Key=key, PartNumber=i,
                                                UploadId='UploadId值')
                # 记录该分块的ETag和编号
                part = {
                    'ETag': response['ETag'],
                    'PartNumber': i,
                }
                parts.append(part)
            
          7. 完成所有分块的拼接,存入ZOS。
            # 完成所有分块拼接后,上传成功。
            s3_client.complete_multipart_upload(
                    Bucket=bucketName,
                    Key=key,
                    MultipartUpload={
                        'Parts': parts
                    },
                    UploadId=uploadID,
               )
            

          整体代码

          from boto3.session import Session
          
          access_key = "此处输入你的Access Key" # 这里输入你的Access Key
          secret_key = "此处输入你的Secret Key" # 这里输入你的Secret Key
          url = "此处输入你的endpoint" # 这里输入你的endpoint
          
          bucketName = '?' # 要传入文件的桶名
          filePos = "?" # 待上传文件所在位置
          
          try:
              session = Session(access_key, secret_key)
              s3_client = session.client('s3', endpoint_url=url)
              # 查询桶中还没有完成或放弃的分块上传,获取需要续传对象的UploadId和Key。
              response = s3_client.list_multipart_uploads(Bucket=bucketName)
              uploadInfo = response['Uploads']
              if uploadInfo is None:
                  print(bucketName + '桶内没有需要断点上传的对象。')
                  raise BaseException
              # 获取需要续传的对象的UploadId和Key,这里以第一个对象为例
              uploadId = uploadInfo[0]['UploadId']
              key = uploadInfo[0]['Key']
          
              # 获取已经完成上传的分块信息
              response = s3_client.list_parts(Bucket=bucketName, Key=key, UploadId=uploadId)
              finishedPartsInfo = response['Parts']
              # 设置列表,用于记录当前已经完成上传分块的编号。
              finishedPartNumbers = []
              # 记录分块的大小。
              partSize = 0
              # 设置列表,用于收集上传分块的ETag和编号。
              parts = []
              for finishedPart in finishedPartsInfo:
                  finishedPartNumbers.append(finishedPart['PartNumber'])
                  if partSize < finishedPart['Size']:
                      partSize = finishedPart['Size']
                  part = {
                      'ETag': finishedPart['ETag'],
                      'PartNumber': finishedPart['PartNumber']
                  }
                  parts.append(part)
          
          
              # 设置列表,用于收集文件的所有分块
              chunks = []
              # 分块读取文件
              with open(filePos, 'rb') as f:
                  while True:
                      chunk = f.read(partSize)  # 此处输入分块大小,本示例是5M,分块大小最低为5M
                      if not chunk:
                          break
                      chunks.append(chunk)
          
              i = 0
              for chunk in chunks:
                  i += 1
                  # 当该分块已经完成上传时,跳过。
                  if i in finishedPartNumbers:
                      continue
                  # 上传分块
                  response = s3_client.upload_part(Bucket=bucketName, Body=chunk,
                                                   Key=key, PartNumber=i,
                                                   UploadId=uploadId)
                  # 记录该分块的ETag和编号
                  part = {
                      'ETag': response['ETag'],
                      'PartNumber': i,
                  }
                  parts.append(part)
          
              # 完成整个拼接传入
              s3_client.complete_multipart_upload(
                  Bucket=bucketName,
                  Key=key,
                  MultipartUpload={
                      'Parts': parts
                  },
                  UploadId=uploadId
              )
              print('文件上传成功!')
          except BaseException:
              print("上传异常,请检查各个参数后重试。")
          finally:
              f.close()
          
          
          上一篇 :  通过云监控服务实时监控对象存储ZOS信息
          下一篇 :  解决浏览器跨域(CORS)问题的实践
          建议与反馈
          以上内容是否对您有帮助?
          有 没有
          感谢您的反馈,您的支持是我们前进的动力!
          您的操作过于频繁,清稍后再试
          文档反馈

          建议您登录后反馈,可在建议与反馈里查看问题处理进度

          鼠标选中文档,精准反馈问题

          选中存在疑惑的内容,即可快速反馈问题,我们会跟进处理

          知道了

           文本反馈

          本页目录

          前提条件
          环境配置
          分段上传
          操作场景
          操作步骤
          整体代码
          追加上传
          操作场景
          操作步骤
          整体代码
          断点续传
          操作场景
          操作步骤
          整体代码
          搜索
            无相关产品
            ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
            公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
            备案 京公网安备11010802043424号 京ICP备 2021034386号
            ©2025天翼云科技有限公司版权所有
            京ICP备 2021034386号
            备案 京公网安备11010802043424号
            增值电信业务经营许可证A2.B1.B2-20090001
            用户协议 隐私政策 法律声明