开发者社区> 问答> 正文

Ruby-SDK之如何实现下载文件?

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)


展开
收起
青衫无名 2017-10-19 12:00:14 2539 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载