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

管理檔案

更新時間: Oct 30, 2018

一個Bucket下可能有非常多的檔案,SDK提供一系列的介面方便使用者管理檔案。

查看所有檔案

通過Bucket#list_objects來列出當前Bucket下的所有檔案。主要的參數如下:

  • :prefix 指定只列出符合特定首碼的檔案
  • :marker 指定只列出檔案名大於marker之後的檔案
  • :delimiter 用於獲取檔案的公共首碼
  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. # 列出所有檔案
  7. objects = bucket.list_objects
  8. objects.each { |o| puts o.key }
  9. # 列出首碼為'my-'的所有檔案
  10. objects = bucket.list_objects(:prefix => 'my-')
  11. objects.each { |o| puts o.key }
  12. # 列出首碼為'my-'且在'my-object'之後的所有檔案
  13. objects = bucket.list_objects(:prefix => 'my-', :marker => 'my-object')
  14. objects.each { |o| puts o.key }

模擬目錄結構

OSS是基於對象的儲存服務,沒有目錄的概念。儲存在一個Bucket中所有檔案都是通過檔案的key唯一標識,並沒有層級的結構。這種結構可以讓OSS的儲存非常高效,但是使用者管理檔案時希望能夠像傳統的檔案系統一樣把檔案分門別類放到不同的“目錄”下面。通過OSS提供的“公共首碼”的功能,也可以很方便地模擬目錄結構。公共首碼的概念請參考查看對象列表

假設Bucket中已有如下檔案:

  1. foo/x
  2. foo/y
  3. foo/bar/a
  4. foo/bar/b
  5. foo/hello/C/1
  6. foo/hello/C/2
  7. ...
  8. foo/hello/C/9999

接下來我們實現一個函數叫list_dir,列出指定目錄下的檔案和子目錄:

  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. def list_dir(dir)
  7. objects = bucket.list_objects(:prefix => dir, :delimiter => '/')
  8. objects.each do |obj|
  9. if obj.is_a?(OSS::Object) # object
  10. puts "Object: #{obj.key}"
  11. else # common prefix
  12. puts "SubDir: #{obj}"
  13. end
  14. end
  15. end

運行結果如下:

  1. > list_dir('foo/')
  2. => SubDir: foo/bar/
  3. SubDir: foo/hello/
  4. Object: foo/x
  5. Object: foo/y
  6. > list_dir('foo/bar/')
  7. => Object: foo/bar/a
  8. Object: foo/bar/b
  9. > list_dir('foo/hello/C/')
  10. => Object: foo/hello/C/1
  11. Object: foo/hello/C/2
  12. ...
  13. Object: foo/hello/C/9999

檔案元資訊

向OSS上傳檔案時,除了檔案內容,還可以指定檔案的一些屬性資訊,稱為“元資訊”。這些資訊在上傳時與檔案一起儲存,在下載時與檔案一起返回。

在SDK中檔案元資訊用一個Hash表示,其他key和value都是String類型,並且都只能是簡單的ASCII可見字元。 所有元資訊的總大小不能超過8KB。

使用Bucket#put_objectBucket#append_objectBucket#resumable_upload時都可以通過指定:metas參數來指定檔案的元資訊:

  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.put_object(
  7. 'my-object-1',
  8. :file => 'local-file',
  9. :metas => {'year' => '2016', 'people' => 'mary'})
  10. bucket.append_object(
  11. 'my-object-2', 0,
  12. :file => 'local-file',
  13. :metas => {'year' => '2016', 'people' => 'mary'})
  14. bucket.resumable_upload(
  15. 'my-object',
  16. 'local-file',
  17. :metas => {'year' => '2016', 'people' => 'mary'})

通過Bucket#update_object_metas命令來更新檔案元資訊:

  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.update_object_metas('my-object', {'year' => '2017'})

拷貝檔案

使用Bucket#copy_object拷貝一個檔案。拷貝時對檔案元資訊的處理有兩種選擇,通過:meta_directive參數指定:

  • 與源檔案相同,即拷貝源檔案的元資訊
  • 使用新的元資訊覆蓋源檔案的資訊
  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. # 拷貝檔案元資訊
  7. bucket.copy_object(
  8. 'my-object', 'copy-object',
  9. :meta_directive => Aliyun::OSS::MetaDirective::COPY)
  10. # 覆蓋檔案元資訊
  11. bucket.copy_object(
  12. 'my-object', 'copy-object',
  13. :metas => {'year' => '2017'},
  14. :meta_directive => Aliyun::OSS::MetaDirective::REPLACE)

刪除檔案

通過Bucket#delete_object來刪除某個檔案:

  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.delete_object('my-object')

大量刪除檔案

通過Bucket#batch_delete_object大量刪除檔案,使用者可以通過:quiet參數來指定是否返回刪除的結果:

  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. objs = ['my-object-1', 'my-object-2']
  7. result = bucket.batch_delete_object(objs)
  8. puts result #['my-object-1', 'my-object-2'],預設返回刪除成功的檔案
  9. objs = ['my-object-3', 'my-object-4']
  10. result = bucket.batch_delete_object(objs, :quiet => true)
  11. puts result #[],不返回刪除的結果