edit-icon download-icon

オブジェクトを管理する

最終更新日: Aug 25, 2017

バケットには多くのオブジェクトが含まれている可能性があります。 SDKには、オブジェクトを便利に管理するための一連のインターフェースが用意されています。

すべてのオブジェクトを表示する

次のコードでは、 Bucket#list_objectsを使用して、現在のバケット内のすべてのオブジェクトをリストします。主なパラメータは次のとおりです。

  • :prefix: 特定の接頭辞を持つオブジェクトのみを表示するように指定します。
  • :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. # List all objects
  7. objects = bucket.list_objects
  8. objects.each { |o| puts o.key }
  9. # List all objects with the "my-" prefix in the name
  10. objects = bucket.list_objects(:prefix => 'my-')
  11. objects.each { |o| puts o.key }
  12. # List all objects that follow the "my-object" marker and whose names contain the "my-" prefix
  13. objects = bucket.list_objects(:prefix => 'my-', :marker => 'my-object')
  14. objects.each { |o| puts o.key }

ディレクトリ構造をシミュレートする

OSSはオブジェクトベースのストレージサービスです。ディレクトリはありません。バケットに格納されたすべてのオブジェクトは、オブジェクトのキーによって一意に識別されます。これらのオブジェクトの間に階層構造は存在しません。このような構造により、OSSはオブジェクトを効率的に格納することができます。しかし、異なるタイプのオブジェクトを異なる”directories” の下に置いて、従来の方法でオブジェクトを管理することができます。 OSSは、ディレクトリ構造を簡単に作成するための “Public Prefix” 機能を提供します。Public Prefixの概念の詳細については、 オブジェクトの一覧表示を参照してください。

バケットにすでに次のオブジェクトが含まれているとします。

  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で表され、オブジェクトのキーと値は両方ともString 型であり、単純な印刷可能なASCII文字のみを含み、改行を含むことはできません 。すべてのメタデータの合計サイズは8 KBを超えることはできません。

注意: オブジェクトのメタ情報は、オブジェクトのアップロード/ダウンロード時にHTTPヘッダーに格納されるため、HTTPに従って複雑な文字を含むことはできません。

Bucket#put_objectBucket#append_objectおよび Bucket#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を使ってオブジェクトをコピーします。オブジェクトがコピーされるとき、オブジェクトメタデータを処理する2つの方法がある。使用されるメソッドは:meta_directive パラメータで指定されます。

  • メソッド 1: COPY操作を通じてソースオブジェクトのメタデータとの一貫性を保つ。
  • メソッド 2: ソースメタデータを新しいメタデータで上書きする。
  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. # Copy the source object metadata
  7. bucket.copy_object(
  8. 'my-object', 'copy-object',
  9. :meta_directive => Aliyun::OSS::MetaDirective::COPY)
  10. # Overwrite the source object metadata
  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']. Names of successfully deleted objects are returned by default.
  9. objs = ['my-object-3', 'my-object-4']
  10. result = bucket.batch_delete_object(objs, :quiet => true)
  11. puts result #[]. The deletion result is not returned.