适用场景
当使用简单上传(PutObject)功能来上传较大的文件到OSS的时候,如果上传的过程中出现了网络错误,那么此次上传失败。重试必须从文件起始位置上传。针对这种情况,OSS提供了分片上传(Multipart Upload)来达到断点续传的效果。顾名思义,分片上传就是将要上传的文件分成多个数据块(OSS里又称之为Part)来分别上传,上传完成之后再调用OSS的接口将这些Part组合成一个Object。
相对于其他的上传方式,分片上传适用于以下场景:
- 恶劣的网络环境:如手机端,当出现上传失败的时候,可以对失败的Part进行独立的重试,而不需要重新上传其他的Part。
- 断点续传:中途暂停之后,可以从上次上传完成的Part的位置继续上传。
- 加速上传:要上传到OSS的本地文件很大的时候,可以并行上传多个Part以加快上传。
- 流式上传:可以在需要上传的文件大小还不确定的情况下开始上传。这种场景在视频监控等行业应用中比较常见。
基本流程
流程如下:
- 将要上传的文件按照一定的大小分片。
- 初始化一个分片上传任务(InitiateMultipartUpload)。
- 逐个或并行上传分片(UploadPart)。
- 完成上传(CompleteMultipartUpload)。
该过程需注意以下几点:
- 除了最后一块Part,其他Part的大小不能小于100KB,否则会导致调用CompleteMultipartUpload接口时失败。
- 要上传的文件切分成Part之后,文件顺序是通过上传过程中指定的partNumber来确定的,实际执行中并没有顺序要求,因此可以实现并发上传。具体的并发个数并不是越多速度越快,要结合用户自身的网络情况和设备负载综合考虑。
- 默认情况下,已经上传但还没有调用CompleteMultipartUpload的Part是不会自动回收的,因此如果要终止上传并删除占用的空间请调用AbortMultipartUpload。如果需要自动回收上传的Part,请参考Object生命周期管理。
断点续传
因为已经上传的Part的生命周期是永久的,因此很容易可以实现断点续传的功能。
在使用分片上传的过程中,如果系统意外崩溃,可以在重启的时候通过ListMultipartUploads和ListParts两个接口来获取某个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级别的访问权限外,还提供了账号级别的授权,见上传安全之授权第三方。