更新时间:2026-10-30 GMT+08:00

多段上传

使用场景

多段上传将单个对象拆分为多个分段分别上传,当对象的所有分段都上传后,OBS将这些段合并起来,然后创建对象。一般而言,如果您的对象大小达到了100MB,应考虑使用多段上传,而不是使用简单上传。使用多段上传具有以下优势:

  • 提高吞吐量:多个分段并行上传可以提高上传速度,最大限度地利用您的带宽。
  • 更好地适应网络波动:如果某一个分段因为网络原因上传失败,只需要重新上传该分段即可,无需重新上传整个对象,帮助您节省时间和流量。
  • 在未知对象大小之前开始上传:如果您在上传对象时无法确认对象的最终大小,例如视频监控场景下,视频文件是实时生成并上传的,这种情况下可使用分段上传。

约束与限制

  • 文件夹不支持多段上传。
  • 一个请求只能上传一个段,可以同时发起多个请求。
  • 分段相关限制:
    表1 分段相关限制

    项目

    限制

    对象大小

    最大48.8TB

    每次上传的段的数量

    最大10000

    段编号

    1到10000(含)

    段大小

    5MB到5GB,最后一个段大小是0到5GB

    列举已上传的段请求返回的段数量

    最大1000

    列举已初始化多段任务请求返回的任务数量

    最大1000

  • 如果您使用SSE-C加密(用户提供密钥),需要在初始化上传段任务、上传段、拷贝段的过程中携带密钥信息,且同一个任务内的多段操作,携带的密钥必须保持一致。合并段无需携带密钥,合并后的对象是一个使用SSE-C方式加密的对象。
  • 如果您使用SSE-KMS或者SSE-OBS加密方式,只需要在初始化上传段任务时配置好加密方式、算法和密钥信息。

费用说明

  • 如果要上传深度归档对象,且上传数量较多的时候,为了降低PUT类请求费用,建议您先使用标准存储进行上传,然后通过生命周期规则将其转储为深度归档类型。
  • 初始化上传段任务并上传一个或多个段之后,您必须合并段或取消多段上传任务,OBS才能释放已上传段的存储空间,并停止向您收取已上传段的存储空间费用。

权限说明

执行多段上传相关操作前,您需要按照下表获取相关权限:

操作

所需权限

初始化上传段任务

您必须是桶拥有者或者拥有PutObject权限。

上传段

您必须是桶拥有者或者拥有PutObject操作的权限。

合并段

您必须是桶拥有者或者拥有PutObject操作的权限。

拷贝段

您必须是桶拥有者或者拥有PutObject、GetObject操作的权限。

列举已上传的段

您必须是桶拥有者或者拥有ListMultipartUploadParts权限。

列举多段上传任务

您必须是桶拥有者或者拥有ListBucketMultipartUploads权限。

取消多段上传任务

您必须是桶拥有者或者拥有AbortMultipartUpload权限。

注意事项

  • 如果上传过程中本地文件发生了改变,则需要重新上传所有分段。
  • 多并发上传同一对象的同一段时,服务端遵循Last Write Win策略,但“Last Write”的时间定义为段元数据创建时间。为了保证数据准确性,客户端需要加锁保证同一对象的同名段上传的并发性。同一对象的不同段并发上传不需要加锁。
  • 上传大量对象时,不要使用顺序前缀(如时间戳或字母顺序)的对象名。因为顺序前缀命名可能会出现大量对象索引集中存储于存储空间中某个特定分区的情况。此时如果请求速率过大,会导致请求速率下降。
  • 建议您开启多版本控制功能防止同名对象被意外覆盖。开启后,被覆盖的对象会以历史版本的形式保存下来,您可以随时恢复历史版本对象。

多段上传流程

图1 多段上传流程图
表2 多段上传流程

序号

操作

说明

1

文件分段

在本地客户端将大文件进行分段处理,单个分段的大小限制为5MB到5GB,最后一个段大小限制是0到5GB。

2

初始化上传段任务

初始化上传任务并获取任务ID,后续的上传段、合并段、列举段等操作都需要携带这个ID,以表明这些操作都归属于指定ID的分段任务。

初始化阶段还会设置对象的多个属性,例如对象的存储类别、对象ACL等。后续的上传段、合并段无需再重复设置这些属性。

3

上传段

上传分段,每一个分段都可以独立上传,并且可以按照任意顺序上传。如果您的网络状况良好,可以使用并发上传以提高速度并充分利用带宽。如果任意分段传输失败,只需重新传输该分段且不会影响其它分段。

如需取消上传,请使用取消多段上传任务接口取消上传并删除已上传至桶中的分段。

4

合并段

当所有分段都成功上传后,开始合并段,将多个分段合并成一个完整的对象。

多段上传使用方式

OBS管理控制台、OBS Browser+、obsutil将详细的多段上传步骤进行了封装,您无需感知具体步骤,只需使用界面或者命令行直接上传即可,详情参见使用OBS控制台多段上传、使用图形化工具OBS Browser+多段上传、使用命令行工具obsutil多段上传,使用SDK参见使用SDK多段上传。为了帮助您理解多段上传的流程,此处使用API Explorer工具调用OBS API,为您详细演示的使用API多段上传的完整过程:

使用API多段上传

步骤一:文件分段

在本地客户端对文件进行分段处理。

  1. 【可选】创建指定大小的文件。此处我们构造一个20M大小的文件test.file,如果您已经准备好待上传的文件,可以跳过此步骤。

    Linux或macOS环境:

    dd if=/dev/urandom of=test.file bs=1M count=20

    Windows环境下打开命令提示符cmd,执行以下命令:

    fsutil file createnew test.file 20971520

  2. 将文件进行分段。此处将20M大小的test.file文件,分为5个4M大小的分段,分段名为test-part**,**为00至04的数字后缀。

    Linux或macOS环境:

    split -b 4M -d test.file test-part

    其中,-b表示每个分段大小的最大值,-d表示分段名称使用数字作为后缀,如:test-part00。

    Windows环境,请使用PowerShell运行以下命令:

    $inputFile = "test.file"
    $outputFilePrefix = "test-part"
    $chunkSize = 4MB
    
    $fs = [System.IO.File]::OpenRead($inputFile)
    $buffer = New-Object byte[] $chunkSize
    $fileNumber = 0
    
    while ($fs.Position -lt $fs.Length) {
    $bytesRead = $fs.Read($buffer, 0, $chunkSize)
    $outputFile = "{0}{1:D2}" -f $outputFilePrefix, $fileNumber
    $fileStream = [System.IO.File]::Create($outputFile)
    $fileStream.Write($buffer, 0, $bytesRead)
    $fileStream.Close()
    $fileNumber++
    }
    
    $fs.Close()

  3. 拆分完成后,您能在执行该命令的目录中看到各个分段。每个分段都有一个与其分段编号对应的后缀,例如:

步骤二:初始化上传段任务

调用初始化上传段任务接口,获取多段上传任务ID。

  1. 进入API Explorer的初始化上传段任务接口调试页面。
  2. 填写API调用参数。

    参数名称

    示例

    说明

    object_key

    test.file

    对象名,上传成功后桶内对象的名字,是整个对象的名字,不是分段名字。

    bucket_name

    example-bucket-a-intl

    桶名,请单击选择对象要上传的桶。

    uploads

    置为空值

    该参数表明本次API调用是一个分段上传任务,而不是普通的POST上传。单击“置为空值”将参数置空。

  3. 单击“调试”。
  4. 调用成功后,可在页面右下角查看响应结果,得到任务ID。

    如图所示本次任务的ID为“000001987D77252A002424CADFB90B1C”

步骤三:上传段

将步骤一中拆分的文件分段上传至桶中。

  1. 进入API Explorer的上传段接口调试页面。
  2. 填写API调用参数。

    参数名称

    示例

    说明

    object_key

    test.file

    对象名,上传成功后桶内对象的名字,是整个对象的名字,不是分段名字,与初始化中填写的对象名一致。

    bucket_name

    example-bucket-a-intl

    桶名,请单击选择对象要上传的桶,与初始化中填写的桶名一致。

    partNumber

    1

    上传段的段编号,取值为从1到10000的整数。注意,段编号唯一地标示了段及其位置,每个段必须按照在对象中的位置有序编号,比如20M的对象分成5段,第一段编号为1,第二段编号为2。

    如果您使用之前上传的段的同一段编号上传新段,则之前上传的段将被覆盖。

    uploadId

    000001987D77252A002424CADFB90B1C

    上传任务ID,与初始化中获取的任务ID保持一致。

    Body

    test-part00

    分段文件。单击参数框右侧的,选择分段文件。

  3. 单击“调试”。
  4. 调用成功后,右侧调试结果页签会提示“调用成功”,可在页面右下角查看响应结果,响应结果中包含该段的ETag值。
  5. 重复2~3,完成所有分段的上传。
  6. 完成上传后,调用列举已上传的段接口,填写参数后单击“调试”,查看所有已上传的段。

    参数名称

    示例

    说明

    object_key

    test.file

    对象名,上传成功后桶内对象的名字,是整个对象的名字,不是分段名字,与初始化中填写的对象名一致。

    bucket_name

    example-bucket-a-intl

    桶名,请单击选择对象要上传的桶,与初始化中填写的桶名一致。

    uploadId

    000001987D77252A002424CADFB90B1C

    上传任务ID,与初始化中获取的任务ID保持一致。

  7. 检查分段是否都上传成功,并获取所有段的段号和ETag值。

    如果6中列举段接口响应结果包含所有分段,说明所有分段都上传成功,此时请记录响应结果中所有段的段编号和ETag值,这些值将作为下一步合并段的请求参数。

步骤四:合并段

本步骤将上传至桶中的分段合并成一个完整的对象。

  1. 进入API Explorer的合并段接口调试页面。
  2. 填写API调用参数。

    参数名称

    示例

    说明

    object_key

    test.file

    对象名,上传成功后桶内对象的名字,是整个对象的名字,不是分段名字,与初始化中填写的对象名一致。

    bucket_name

    example-bucket-a-intl

    桶名,请单击选择对象要上传的桶,与初始化中填写的桶名一致。

    uploadId

    000001987D77252A002424CADFB90B1C

    上传任务ID,与初始化中获取的任务ID保持一致。

    Body

    <CompleteMultipartUpload> 
        <Part>
            <PartNumber>1</PartNumber>
            <ETag>"ef0bff811bdb99fb44804719bd0f6877"</ETag>
        </Part>
        <Part>
            <PartNumber>2</PartNumber>
            <ETag>"ef0bff811bdb99fb44804719bd0f8678"</ETag>
        </Part>
        <Part>
            <PartNumber>3</PartNumber>
            <ETag>"ef0bff811bdb99fb44804719bd0f7687"</ETag>
        </Part>
        <Part>
            <PartNumber>4</PartNumber>
            <ETag>"ef0bff811bdb99fb44804719bd0f7876"</ETag>
        </Part>
        <Part>
            <PartNumber>5</PartNumber>
            <ETag>"ef0bff811bdb99fb44804719bd0f7786"</ETag>
        </Part>
    </CompleteMultipartUpload>

    任务中所有分段的段信息和ETag值,您可以待所有分段都上传后,调用列举段接口批量获取,参见7。或者每上传一个段,在响应结果中获取,参见4。

    注意:

    如果合并段时,遗漏了某个段,那么未被合并的段将会被系统自动删除且不可恢复。例如上传了10个段,但合并时只选择了9个段进行合并,那么遗漏的一个段会被删除且不可恢复。

    所以合并段前请列出已上传的段,仔细核对所有段,确保没有段被遗漏。

  3. 单击“调试”。
  4. 调用成功后,右侧调试结果页签会提示“调用成功”,响应结果会返回最终的对象名、桶名和完整对象的ETag值:

相关操作

以下是和多段上传相关的其他操作:

多段上传最佳实践

  • 合理控制并发数,兼顾速度与稳定

    多段上传可通过并发分段提升传输速度,但并非并发越多越好。过多并发会增加系统负载、引发网络拥塞,反而降低上传速度;过少则无法充分利用带宽资源。建议根据网络带宽和设备性能动态确定合理的并发分段数量。

  • 避免使用顺序前缀给对象命名

    OBS按照对象名的UTF-8编码范围来进行分区管理。如果用户在对象命名规则上使用了顺序前缀(如时间戳或字母顺序),可能导致大量对象的请求访问集中于某个特定分区,造成访问热点。热点分区上的请求速率受限,访问时延会上升。推荐使用随机前缀对象名,这样请求就会均匀分布在多个分区,达到水平扩展的效果,详见OBS性能优化建议。

  • 利用断点续传,保障可靠传输

    多段上传任务无过期时间限制,支持暂停与恢复。每个上传任务以Upload ID为唯一标识,当某个分段因网络抖动或设备故障上传失败时,只需重传该分段,无需从头上传整个文件,从而提升传输效率。

相关文档

如果您有大量的数据(大于48.8TB)需要上传至OBS,可以参考搬迁本地数据至OBS。