阿里雲團隊努力不懈,力求將最新的技術內容更快地以您最熟悉的語言呈現。本文由簡體中文內容自動轉碼而成,過程無人工干預。阿里雲不保證此自動轉碼的準確性、完整性及時效性。因轉碼造成的任何內容錯誤及因此可能帶來的損失,阿里雲概不負責,敬請見諒。本文内容請以簡體中文版本為準。
全部產品
Search
文件中心

下載檔案

更新時間: Mar 21, 2019

OSS Ruby SDK提供了豐富的檔案下載介面,使用者可以通過以下方式從OSS中下載檔案:

  • 下載到本地檔案
  • 流式下載
  • 斷點續傳下載
  • HTTP下載(瀏覽器下載)

下載到本地檔案

通過Bucket#get_object介面,並指定:file參數來下載到一個本地檔案到:

  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. bucket.get_object('my-object', :file => 'local-file')

流式下載

在進行大檔案下載時,往往不希望一次性處理全部的內容,而是希望流式地處理,一次處理一部分內容。通過Bucket#get_object介面,並指定block參數來串流下載的內容:

  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. bucket.get_object('my-object') do |chunk|
  7. # handle_data(chunk)
  8. puts "Got a chunk, size: #{chunk.size}."
  9. 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檔案都會被刪除。

  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. bucket.resumable_download('my-object', 'local-file') do |p|
  7. puts "Progress: #{p}"
  8. end
  9. bucket.resumable_download(
  10. 'my-object', 'local-file',
  11. :part_size => 100 * 1024, :cpt_file => '/tmp/x.cpt') { |p|
  12. puts "Progress: #{p}"
  13. }

注意:

  • 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
  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. # 生成URL,預設帶簽名,有效時間為60秒
  7. puts bucket.object_url('my-object')
  8. # http://my-bucket.oss-cn-hangzhou.aliyuncs.com/my-object?Expires=1448349966&OSSAccessKeyId=5viOH******K72ht&Signature=aM2HpBLeMq1aec6JCd7BBAKYiwI%3D
  9. # 不帶簽名的URL
  10. puts bucket.object_url('my-object', false)
  11. # http://my-bucket.oss-cn-hangzhou.aliyuncs.com/my-object
  12. # 指定URL過期時間為1小時(3600秒)
  13. puts bucket.object_url('my-object', true, 3600)