通过断点续传上传的方式将文件上传到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来处理。
关于参数说明的更多信息,请参见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文件会被删除。
  • 上传过程中如果本地文件发生了改变,会导致上传失败。