バケットには多くのオブジェクトが含まれている可能性があります。 SDKには、オブジェクトを便利に管理するための一連のインターフェースが用意されています。
すべてのオブジェクトを表示する
次のコードでは、 Bucket#list_objects
を使用して、現在のバケット内のすべてのオブジェクトをリストします。主なパラメータは次のとおりです。
- :prefix: 特定の接頭辞を持つオブジェクトのみを表示するように指定します。
- :marker: 指定されたマーカーよりも大きな名前のオブジェクトを表示するように指定します。
- :delimiter: オブジェクトの共通接頭辞を取得する
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
endpoint: 'endpoint',
access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
bucket = client.get_bucket('my-bucket')
# List all objects
objects = bucket.list_objects
objects.each { |o| puts o.key }
# List all objects with the "my-" prefix in the name
objects = bucket.list_objects(:prefix => 'my-')
objects.each { |o| puts o.key }
# List all objects that follow the "my-object" marker and whose names contain the "my-" prefix
objects = bucket.list_objects(:prefix => 'my-', :marker => 'my-object')
objects.each { |o| puts o.key }
ディレクトリ構造をシミュレートする
OSSはオブジェクトベースのストレージサービスです。ディレクトリはありません。バケットに格納されたすべてのオブジェクトは、オブジェクトのキーによって一意に識別されます。これらのオブジェクトの間に階層構造は存在しません。このような構造により、OSSはオブジェクトを効率的に格納することができます。しかし、異なるタイプのオブジェクトを異なる”directories” の下に置いて、従来の方法でオブジェクトを管理することができます。 OSSは、ディレクトリ構造を簡単に作成するための “Public Prefix” 機能を提供します。Public Prefixの概念の詳細については、 オブジェクトの一覧表示を参照してください。
バケットにすでに次のオブジェクトが含まれているとします。
foo/x
foo/y
foo/bar/a
foo/bar/b
foo/hello/C/1
foo/hello/C/2
...
foo/hello/C/9999
次に、list_dir
という名前の関数を実装して、指定されたディレクトリ内のすべてのオブジェクトとサブディレクトリをリストします。
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
endpoint: 'endpoint',
access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
bucket = client.get_bucket('my-bucket')
def list_dir(dir)
objects = bucket.list_objects(:prefix => dir, :delimiter => '/')
objects.each do |obj|
if obj.is_a?(OSS::Object) # object
puts "Object: #{obj.key}"
else # common prefix
puts "SubDir: #{obj}"
end
end
end
実行結果は次のとおりです。
> list_dir('foo/')
=> SubDir: foo/bar/
SubDir: foo/hello/
Object: foo/x
Object: foo/y
> list_dir('foo/bar/')
=> Object: foo/bar/a
Object: foo/bar/b
> list_dir('foo/hello/C/')
=> Object: foo/hello/C/1
Object: foo/hello/C/2
...
Object: foo/hello/C/9999
オブジェクトメタデータ
OSSにオブジェクトをアップロードするときは、オブジェクトの内容を除き、オブジェクトの特定の属性情報を指定できます。属性情報はメタ情報と呼ばれる。メタデータは、アップロード中にオブジェクトとともに格納され、ダウンロード中にオブジェクトとともに返されます。
SDKでは、オブジェクトのメタデータはHash
で表され、オブジェクトのキーと値は両方ともString
型であり、単純な印刷可能なASCII文字のみを含み、改行を含むことはできません 。すべてのメタデータの合計サイズは8 KBを超えることはできません。
注意: オブジェクトのメタ情報は、オブジェクトのアップロード/ダウンロード時にHTTPヘッダーに格納されるため、HTTPに従って複雑な文字を含むことはできません。
Bucket#put_object
、 Bucket#append_object
および Bucket#resumable_upload
を使用する際、:metas
パラメータを指定することによって、オブジェクトメタデータを指定できます。
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.put_object(
'my-object-1',
:file => 'local-file',
:metas => {'year' => '2016', 'people' => 'mary'})
bucket.append_object(
'my-object-2', 0,
:file => 'local-file',
:metas => {'year' => '2016', 'people' => 'mary'})
bucket.resumable_upload(
'my-object',
'local-file',
:metas => {'year' => '2016', 'people' => 'mary'})
Bucket#update_object_metas
コマンドを実行して、オブジェクトのメタデータを更新します。
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.update_object_metas('my-object', {'year' => '2017'})
オブジェクトをコピーする
次のコードはBucket#copy_object
を使ってオブジェクトをコピーします。オブジェクトがコピーされるとき、オブジェクトメタデータを処理する2つの方法がある。使用されるメソッドは:meta_directive
パラメータで指定されます。
- メソッド 1: COPY操作を通じてソースオブジェクトのメタデータとの一貫性を保つ。
- メソッド 2: ソースメタデータを新しいメタデータで上書きする。
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
endpoint: 'endpoint',
access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
bucket = client.get_bucket('my-bucket')
# Copy the source object metadata
bucket.copy_object(
'my-object', 'copy-object',
:meta_directive => Aliyun::OSS::MetaDirective::COPY)
# Overwrite the source object metadata
bucket.copy_object(
'my-object', 'copy-object',
:metas => {'year' => '2017'},
:meta_directive => Aliyun::OSS::MetaDirective::REPLACE)
オブジェクトを削除する
次のコードは Bucket#delete_object
を使ってオブジェクトを削除します。
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.delete_object('my-object')
バッチ内のオブジェクトを削除する
次のコードでは、バケット内のオブジェクトを削除するために Bucket#batch_delete_object
を使用しています。削除結果を返すかどうかを決定するために :quiet
パラメータを設定することができます。
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
endpoint: 'endpoint',
access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
bucket = client.get_bucket('my-bucket')
objs = ['my-object-1', 'my-object-2']
result = bucket.batch_delete_object(objs)
puts result #['my-object-1', 'my-object-2']. Names of successfully deleted objects are returned by default.
objs = ['my-object-3', 'my-object-4']
result = bucket.batch_delete_object(objs, :quiet => true)
puts result #[]. The deletion result is not returned.