全部产品
对象存储 OSS

下载文件

更新时间:2017-06-07 13:26:11   分享:   

OSS Ruby SDK提供了丰富的文件下载接口,用户可以通过以下方式从OSS中下载 文件:

  • 下载到本地文件
  • 流式下载
  • 断点续传下载
  • HTTP下载(浏览器下载)

下载到本地文件

通过Bucket#get_object接口,并指定:file参数来下载到一个本地文件到:

require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  endpoint: 'endpoint',
  access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')

bucket = client.get_bucket('my-bucket')
bucket.get_object('my-object', :file => 'local-file')

流式下载

在进行大文件下载时,往往不希望一次性处理全部的内容,而是希望流 式地处理,一次处理一部分内容。 通过Bucket#get_object接口,并指定block参数来流式处理下载的内容:

require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  endpoint: 'endpoint',
  access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')

bucket = client.get_bucket('my-bucket')
bucket.get_object('my-object') do |chunk|
  # handle_data(chunk)
  puts "Got a chunk, size: #{chunk.size}."
end

断点续传下载

当下载大文件时,如果网络不稳定或者程序崩溃了,则整个下载就失败了。用户 不得不重头再来,这样做不仅浪费资源,在网络不稳定的情况下,往往重试多次 还是无法完成下载。 通过Bucket#resumable_download接口来实现断点续传下载。它有以下参数:

  • key 要下载的Object名字
  • file 下载到本地文件的路径
  • opts 可选项,主要包括:
    • :cpt_file 指定checkpoint文件的路径,如果不指定则默认为与本地文件同 目录下的file.cpt,其中file是本地文件的名字
    • :disable_cpt 如果指定为true,则下载过程中不会记录下载进度,失败后 也无法进行续传
    • :part_size 指定每个分片的大小,默认为10MB
    • &block 如果调用时候传递了block,则下载进度会交由block处理

详细的参数请参考API文档

其实现的原理是将要下载的Object分成若干个分片分别下载,最后所有分片都下 载成功后,完成整个文件的下载。在下载的过程中会记录当前下载的进度信息 (记录在checkpoint文件中)和已下载的分片(保存为file.part.N,其中 file是下载的本地文件的名字),如果下载过程中某一分片下载失败,再次下 载时会从checkpoint文件中记录的点继续下载。这要求再次调用时要指定与上次 相同的checkpoint文件。下载完成后,part文件和checkpoint文件都会被删除。

require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  endpoint: 'endpoint',
  access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')

bucket = client.get_bucket('my-bucket')
bucket.resumable_download('my-object', 'local-file') do |p|
  puts "Progress: #{p}"
end

bucket.resumable_download(
  'my-object', 'local-file',
  :part_size => 100 * 1024, :cpt_file => '/tmp/x.cpt') { |p|
  puts "Progress: #{p}"
}

注意:

  • SDK会将下载的中间状态信息记录在cpt文件中,所以要确保用户对cpt文 件有写权限
  • SDK会将已下载的分片保存在part文件中,所以要确保用户对file所在的目 录有创建文件的权限
  • cpt文件记录了下载的中间状态信息并自带了校验,用户不能去编辑它,如 果cpt文件损坏则下载无法继续
  • 如果下载过程中待下载的Object发生了改变(ETag改变),或者part文件丢 失或被修改,则下载会报错

HTTP下载

对于存放在OSS中的文件,在不用SDK的情况下用户也可以直接使用HTTP下载,这 包括直接使用浏览器下载,或者使用wget, curl等命令行工具下载。这时文 件的URL需要由SDK生成。使用Bucket#object_url方法生成可下载的HTTP地址, 它接受以下参数:

  • key 待下载的Object的名字
  • sign 是否生成带签名的URL,对于拥有public-read/public-read-write权限 的Object,不带签名的URL也可以访问;对于private权限的Object,则必须使 用带签名的URL才能访问
  • expiry URL的有效时间,默认为60s
require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  endpoint: 'endpoint',
  access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')

bucket = client.get_bucket('my-bucket')
# 生成URL,默认带签名,有效时间为60秒
puts bucket.object_url('my-object')
# http://my-bucket.oss-cn-hangzhou.aliyuncs.com/my-object?Expires=1448349966&OSSAccessKeyId=5viOHfldyK6K72ht&Signature=aM2HpBLeMq1aec6JCd7BBAKYiwI%3D

# 不带签名的URL
puts bucket.object_url('my-object', false)
# http://my-bucket.oss-cn-hangzhou.aliyuncs.com/my-object

# 指定URL过期时间为1小时(3600秒)
puts bucket.object_url('my-object', true, 3600)
本文导读目录
本文导读目录
以上内容是否对您有帮助?