阿里云OSS提供分片上传功能,可以将待上传的文件分成多个碎片(Part)分别上传,上传完成之后再调用CompleteMultipartUpload接口将这些Part组合成一个Object。若上传过程中出现网络错误导致上传失败,您还可以从最后一块成功上传的Part开始继续上传,从而实现断点续传效果。

适用场景

  • 大文件加速上传

    当文件大小超过5 GB时,使用分片上传可实现并行上传多个Part以加快上传速度。

  • 网络环境较差

    网络环境较差时,建议使用分片上传。当出现上传失败的时候,您仅需重传失败的Part。

  • 流式上传

    可以在需要上传的文件大小还不确定的情况下开始上传。这种场景在视频监控等行业应用中比较常见。

分片上传流程

分片上传的基本流程如下图所示。

流程说明如下:

  1. 将待上传文件按照一定大小进行分片。
  2. 使用InitiateMultipartUpload接口初始化一个分片上传任务。
  3. 使用UploadPart接口上传分片。

    文件切分成Part之后,文件顺序是通过上传过程中指定的partNumber来确定,所以您可以并发上传这些碎片。并发数并非越多越快,请结合自身网络状况和设备负载综合考虑。

    若您希望终止上传任务,可调用AbortMultipartUpload接口,成功上传的Part会一并删除。

  4. 使用CompleteMultipartUpload接口将Part组合成一个Object。

使用限制

限制项 规格
文件大小 不超过48.8 TB
Part数量 1~10, 000个
单个Part大小 最小值为100 KB,最大值为5 GB。最后一个Part的大小无限制。
单次ListParts请求返回的Part最大数量 1, 000个
单次ListMultipartUploads请求返回的Multipart Upload事件最大数量 1, 000个

注意事项

  • 文件上传性能调优

    如果您在上传大量文件时,在命名上使用了顺序前缀(如时间戳或字母顺序),可能会出现大量文件索引集中存储于存储空间中某个特定分区的情况。此时如果您的请求速率过大,会导致请求速率下降。建议您在上传大量文件时,不要使用顺序前缀的文件名。更多信息,请参见OSS性能与扩展性最佳实践

  • 文件覆盖

    上传同名文件会覆盖OSS中已有文件。您可以通过以下方式防止文件被意外覆盖:

    • 开启版本控制功能

      开启版本控制功能后,被覆盖的文件会以历史版本的形式保存下来,您可以随时恢复历史版本文件。更多信息,请参见版本控制介绍

    • 在上传请求中携带禁止覆盖同名文件的参数

      在上传请求的header中携带x-oss-forbid-overwrite参数,并指定其值为true。当您上传的文件在OSS中存在同名文件时,该文件会上传失败,并返回FileAlreadyExists错误。更多信息,请参见InitiateMultipartUpload

  • 删除Part
    分片上传过程被中断后,已上传的Part会一直保存在Bucket中。若您不再需要这些Part,请通过以下方式删除,以免产生额外存储费用。

分片上传操作方式

操作方式 说明
命令行工具ossutil 命令行工具,性能好
Java SDK 丰富、完整的各类语言SDK demo
Python SDK
PHP SDK
Go SDK
C SDK
.NET SDK
Node.js SDK
Android SDK
iOS SDK
Browser.js SDK

断点续传操作方式

在使用分片上传的过程中,如果因意外导致上传失败,可以在重启的时候通过 ListMultipartUploadsListParts两个接口来获取某个Object上的所有的分片上传任务和每个分片上传任务中上传成功的Part列表。然后从最后一块成功上传的Part开始继续上传,从而达到断点续传的效果。
操作方式 说明
Java SDK 丰富、完整的各类语言SDK demo
Python SDK
Go SDK
C SDK
.NET SDK
Node.js SDK
Android SDK
iOS SDK