通过断点续传上传的方式将文件上传到OSS前,您可以指定断点记录点。上传过程中,如果出现网络异常或程序崩溃导致文件上传失败时,将从断点记录处继续上传未上传完成的部分。
断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。
通过Bucket#resumable_upload
接口实现断点续传上传,包含以下参数:
- key上传到OSS的Object名字。
- file待上传的本地文件路径。
- opts可选项,主要包括:
- :cpt_file指定checkpoint文件的路径。如果不指定,则默认是本地文件同目录下的
file.cpt
,其中file
是本地文件的名字。 - :disable_cpt如果指定为true,则上传过程中不会记录上传进度,上传失败后也无法进行续传。
- :part_size指定每个分片的大小,默认为4 MB。
- &block如果调用时传递了block,则上传进度会由block来处理。
- :cpt_file指定checkpoint文件的路径。如果不指定,则默认是本地文件同目录下的
关于参数说明的更多信息,请参见API文档。
说明 如果上传过程中某一分片上传失败,再次上传时会从checkpoint文件中记录的点继续上传。再次调用
Bucket#resumable_upload
时需指定与上次相同的checkpoint文件。文件上传完成后,checkpoint文件将被删除。示例代码
以下代码用于断点续传上传。
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
# 填写Bucket名称,例如examplebucket。
bucket = client.get_bucket('examplebucket')
# my-object填写Object完整路径,完整路径中不能包含Bucket名称。
# local-file填写本地文件的完整路径。
bucket.resumable_upload('my-object', 'local-file') do |p|
puts "Progress: #{p}"
end
bucket.resumable_upload(
'my-object', 'local-file',
:part_size => 100 * 1024, :cpt_file => '/tmp/x.cpt') { |p|
puts "Progress: #{p}"
}
说明
- SDK会将上传的中间状态信息记录在cpt文件中,用户需确保对cpt文件有写权限。
- cpt文件不仅记录了上传的中间状态信息,还附带校验功能。cpt文件不允许编辑。如果cpt文件损坏则无法继续上传,整个文件上传完成后cpt文件会被删除。
- 上传过程中如果本地文件发生了改变,会导致上传失败。