适用场景

当使用简单上传(PutObject)功能来上传较大的文件到OSS的时候,如果上传的过程中出现了网络错误,那么此次上传失败。重试必须从文件起始位置上传。针对这种情况,OSS提供了分片上传(Multipart Upload)来达到断点续传的效果。顾名思义,分片上传就是将要上传的文件分成多个数据块(OSS里又称之为Part)来分别上传,上传完成之后再调用OSS的接口将这些Part组合成一个Object。

相对于其他的上传方式,分片上传适用于以下场景:

  • 恶劣的网络环境:如手机端,当出现上传失败的时候,可以对失败的Part进行独立的重试,而不需要重新上传其他的Part。
  • 断点续传:中途暂停之后,可以从上次上传完成的Part的位置继续上传。
  • 加速上传:要上传到OSS的本地文件很大的时候,可以并行上传多个Part以加快上传。
  • 流式上传:可以在需要上传的文件大小还不确定的情况下开始上传。这种场景在视频监控等行业应用中比较常见。

基本流程

流程如下:

  1. 将要上传的文件按照一定的大小分片。
  2. 初始化一个分片上传任务(InitiateMultipartUpload)。
  3. 逐个或并行上传分片(UploadPart)。
  4. 完成上传(CompleteMultipartUpload)。


该过程需注意以下几点:

  • 除了最后一块Part,其他Part的大小不能小于100KB,否则会导致调用CompleteMultipartUpload接口时失败。
  • 要上传的文件切分成Part之后,文件顺序是通过上传过程中指定的partNumber来确定的,实际执行中并没有顺序要求,因此可以实现并发上传。具体的并发个数并不是越多速度越快,要结合用户自身的网络情况和设备负载综合考虑。
  • 默认情况下,已经上传但还没有调用CompleteMultipartUpload的Part是不会自动回收的,因此如果要终止上传并删除占用的空间请调用AbortMultipartUpload。如果需要自动回收上传的Part,请参考Object生命周期管理

断点续传

因为已经上传的Part的生命周期是永久的,因此很容易可以实现断点续传的功能。

在使用分片上传的过程中,如果系统意外崩溃,可以在重启的时候通过ListMultipartUploadsListParts两个接口来获取某个Object上的所有的分片上传任务和每个分片上传任务中上传成功的Part列表。这样就可以从最后一块成功上传的Part开始继续上传,从而达到断点续传的效果。暂停和恢复上传实现原理也是一样的。

断点续传功能在移动设备和大文件上传中的优势尤为明显。

上传限制

  • 大小限制:在这种上传方式下,Object的大小是由Part来决定的,最大支持10000块Part。每块Part最小100KB(最后一块可以比100KB小),最大5GB。Object的大小不能超过48.8TB。
  • 命名限制
    • 使用UTF-8编码。
    • 长度必须在1–1023字节之间。
    • 不能以正斜线(/)或者反斜线(\)字符开头。

上传的安全及授权

为了防止第三方往开发者的Bucket未经授权上传,OSS提供了Bucket和Object级别的访问权限控制,详细解释见访问控制。为了授权给第三方上传,OSS除了Bucket和Object级别的访问权限外,还提供了账号级别的授权,见上传安全之授权第三方

上传后续操作

  • 在文件上传到OSS上后,开发者可以使用上传后回调来向指定的应用服务器发起回调请求,进行下一步操作。
  • 如果上传的是图片,可以使用图片服务进行后续处理。
  • 如果上传的是音频或者视频文件,可以使用媒体转码进行后续处理。

功能使用参考:

最佳实践