edit-icon download-icon

オブジェクト

最終更新日: Sep 20, 2016

オブジェクトはユーザー操作の基本的な OSS データユニットです。1 つのオブジェクトの最大サイズは、データアップロードモードによって異なる場合があります。オブジェクトのサイズは、Put Object モードでは 5 GB 以下、マルチパートアップロードモードでは 48.8 TB 以下の制限があります。オブジェクトには、key、meta、および data が含まれます。key はオブジェクト名です。meta は、オブジェクトの説明で、名前と値の一連のペアで構成されます。data はオブジェクトデータです。

命名規則

オブジェクト命名規則:

  • UTF-8 エンコーディングを使用します。
  • 長さは 1 ~ 1023 バイトでなければなりません。
  • “/“ または “\” で開始することはできません。
  • “\r” または “\n” の改行を含めることはできません。

オブジェクトのアップロード

簡単なアップロード

指定された文字列のアップロード

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. string str = "a line of simple text";
  4. byte[] binaryData = Encoding.ASCII.GetBytes(str);
  5. MemoryStream requestContent = new MemoryStream(binaryData);
  6. client.PutObject(bucketName, key, requestContent);

指定されたローカルファイルのアップロード

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. String fileToUpload = "your local file";
  4. client.PutObject(bucketName, key, fileToUpload);

このメソッドを使用してアップロードする最大ファイルは 5 GB を超えることはできません。サイズ制限を超える場合は、代わりに multipartupload を使用してアップロードできます。

シミュレーションフォルダーの作成

OSS サービスでは、フォルダーを使用しません。すべての要素はオブジェクトとして格納されます。ただし、次のコードを使用してシミュレーションフォルダーを作成できます。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. // Note: key treats as a folder and must end with a slash.
  4. const string key = "yourfolder/";
  5. // put object with zero bytes stream.
  6. using (MemoryStream ms = new MemoryStream())
  7. {
  8. client.PutObject(bucketName, key, ms);
  9. }

実際、シミュレーションフォルダーを作成することは、サイズが 0 のオブジェクトを作成することです。このオブジェクトはアップロードおよびダウンロードできます。コンソールには、”/“ で終わるオブジェクトがフォルダーとして表示されるため、 この方法でシミュレーションフォルダーを作成できます。フォルダーにアクセスする場合は、「フォルダーシミュレーション機能」を参照してください。

オブジェクトの Http ヘッダーの設定

OSS サービスを使用すると、オブジェクトの Http ヘッダーをカスタマイズできます。次のコードでは、オブジェクトの有効期限を設定しています。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. using (var fs = File.Open(fileToUpload, FileMode.Open))
  4. {
  5. var metadata = new ObjectMetadata();
  6. metadata.ContentLength = fs.Length;
  7. metadata.ExpirationTime = DateTime.Parse("2015-10-12T00:00:00.000Z")
  8. client.PutObject(bucketName, key, fs, metadata);
  9. }

.NET SDK は、Cache-Control、Content-Disposition、Content-Encoding、および Expires の 4 種類の Http ヘッダーをサポートしています。ヘッダーの詳細については、『RFC2616』を参照してください。

ユーザー定義メタデータ

OSS では、ユーザーがオブジェクトを表すメタデータを定義できます。例:

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. using (var fs = File.Open(fileToUpload, FileMode.Open))
  4. {
  5. var metadata = new ObjectMetadata();
  6. metadata.UserMetadata.Add("name", "my-data");
  7. metadata.ContentLength = fs.Length;
  8. client.PutObject(bucketName, key, fs, metadata);
  9. }

上記のコードでは、名前が “name” で値が “my-data” のメタデータを定義しています。このオブジェクトをダウンロードする場合、ユーザーはメタデータも取得します。1 つのオブジェクトに複数の同様のパラメーターを含むことができますが、すべてのユーザーメタの合計サイズは 2 KB 以内である必要があります。

注意: ユーザーメタの名前では大文字小文字は区別されません。たとえば、ユーザーがオブジェクトをアップロードし、メタデータの名前を “Name” と定義すると、ヘッダーに格納されているパラメーターが “x-oss-meta-name” になります。したがって、オブジェクトにアクセスするときは、”name” という名前のパラメーターを使用します。ただし、格納されているパラメーターが “name” であり、そのパラメーターの情報が見つからない場合、システムは “Null” を返します。

マルチパートアップロード

OSS では、サーバーにアップロードする 1 つのオブジェクトを複数のリクエストに分割できます。マルチパートアップロードコンテンツについては、「MultipartUpload」の「Object Multipart Upload」を参照してください。

バケットオブジェクトの一覧表示

オブジェクトのリスト

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. public void ListObject(String bucketName)
  4. {
  5. var listObjectsRequest = new ListObjectsRequest(bucketName);
  6. var result = ossClient.ListObjects(listObjectsRequest);
  7. foreach (var summary in result.ObjectSummaries)
  8. {
  9. Console.WriteLine(summary.Key);
  10. }
  11. }

注意: デフォルトでは、バケットに 100 を超えるオブジェクトが含まれている場合、最初の 100 個のみが返され、返される結果の IsTruncated パラメーターは true になります。返される NextMarker を、次のデータアクセスの開始位置として使用できます。MaxKeys パラメーターを変更するか、それぞれのアクセスに Marker パラメーターを使用して、返されるオブジェクトエントリの数を増やすことができます。

拡張パラメーター

一般に、ListObjectsRequest パラメーターはさらに強力な機能を提供します。例:

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. var listObjectsRequest = new ListObjectsRequest(bucketName)
  4. {
  5. Delimiter = "/",
  6. Marker = "abc"
  7. };
  8. result = ossClient.ListObjects(listObjectsRequest);
  9. foreach (var summary in result.ObjectSummaries)
  10. {
  11. Console.WriteLine(summary.Key);
  12. }

設定可能なパラメーター名とその機能:

名前 機能
Delimiter オブジェクト名の文字をグループ化するために使用されます。すべての名前には指定されたプレフィックスが含まれ、最初の Delimiter 文字間のオブジェクトは、グループ要素 CommonPrefixes として機能します。
Marker アルファベット順で marker 後の最初のエントリから結果を返すように設定します。
MaxKeys 1 件のリクエストに対して返されるオブジェクトの最大数を制限します。指定されていない場合のデフォルト値は 100 です。MaxKeys の値は 1000 以下にする必要があります。
Prefix 返されるオブジェクトキーにプレフィックスが付いていることを要求します。プレフィックスを使用するクエリから返されるキーにはそのプレフィックスも含まれることに注意してください。

全体で 1,000 を超える一連のオブジェクトをトラバースするためには複数のイテレーションを実行する必要があります。各イテレーション中に、最後のイテレーションの最終的なオブジェクトキーを現在のイテレーションの Marker として使用できます。

フォルダー機能のシミュレーション

Delimiter と Prefix を組み合わせてフォルダー関数をシミュレートできます。Delimiter と Prefix を組み合わせる目的は次のとおりです。フォルダーの名前としてプレフィックスを設定すると、このプレフィックスで始まるファイルが列挙され、このフォルダー内のすべてのファイルとサブフォルダーが再帰的に返されます。Delimiter が “/“ として設定されている場合、返される値にはフォルダー内のファイルが列挙され、サブフォルダーは CommonPrefixes セクションで返されます。サブフォルダー内のファイルとフォルダーは再帰的に表示されません。バケットに oss.jpg、fun/test.jpg、fun/movie/001.avi、fun/movie/007.avi の 4 つのファイルが含まれる場合、 フォルダーの区切り記号として “/“ 記号を使用します。

すべてのバケットファイルのリスト

バケット内のすべてのファイルを取得するには、次のように記述します。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. ObjectListing result = null;
  4. string nextMarker = string.Empty;
  5. do
  6. {
  7. var listObjectsRequest = new ListObjectsRequest(bucketName)
  8. {
  9. Marker = nextMarker,
  10. MaxKeys = 100
  11. };
  12. result = client.ListObjects(listObjectsRequest);
  13. foreach (var summary in result.ObjectSummaries)
  14. {
  15. Console.WriteLine(summary.Key);
  16. }
  17. nextMarker = result.NextMarker;
  18. } while (result.IsTruncated);

出力:

  1. Objects:
  2. fun/movie/001.avi
  3. fun/movie/007.avi
  4. fun/test.jpg
  5. oss.jpg
  6. CommonPrefixs:

ディレクトリ内のすべてのファイルの再帰的なリスト

Prefix パラメーターを次のように設定して、ディレクトリ内のすべてのファイルを取得できます。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. var listObjectsRequest = new ListObjectsRequest(bucketName)
  4. {
  5. Prefix = "fun/"
  6. };
  7. result = client.ListObjects(listObjectsRequest);
  8. foreach (var summary in result.ObjectSummaries)
  9. {
  10. Console.WriteLine(summary.Key);
  11. }

出力:

  1. Objects:
  2. fun/movie/001.avi
  3. fun/movie/007.avi
  4. fun/test.jpg
  5. CommonPrefixs:

ディレクトリ内のファイルとサブディレクトリのリスト

Prefix と Delimiter を組み合わせて使用して、ディレクトリ内のファイルとサブディレクトリをリストできます。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. var listObjectsRequest = new ListObjectsRequest(bucketName)
  4. {
  5. Prefix = "fun/",
  6. Delimiter = "/"
  7. };
  8. result = client.ListObjects(listObjectsRequest);
  9. Console.WriteLine("Objects:");
  10. foreach (var summary in result.ObjectSummaries)
  11. {
  12. Console.WriteLine(summary.Key);
  13. }
  14. Console.WriteLine("CommonPrefixes:");
  15. foreach (var prefix in result.CommonPrefixes)
  16. {
  17. Console.WriteLine(prefix);
  18. }

出力:

  1. Objects:
  2. fun/test.jpg
  3. CommonPrefixs:
  4. fun/movie/

返される結果で、ObjectSummaries リストに fun ディレクトリ内のファイルが含まれます。CommonPrefixs リストには fun ディレクトリのすべてのサブフォルダーが示されます。fun/movie/001.avi および fun/movie/007.avi ファイルは fun フォルダーの movie ディレクトリにあるため、リストされていません。

オブジェクトの取得

オブジェクトの単純な取得

次のコードを使用してオブジェクトを取得し、ストリームに入力することができます。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. public void GetObject(String bucketName, string key)
  4. {
  5. var o = client.GetObject(bucketName, key);
  6. using (var requestStream = o.Content)
  7. {
  8. byte[] buf = new byte[1024];
  9. var fs = File.Open(fileToDownload, FileMode.OpenOrCreate);
  10. var len = 0;
  11. while ((len = requestStream.Read(buf, 0, 1024)) != 0)
  12. {
  13. fs.Write(buf, 0, len);
  14. }
  15. fs.Close();
  16. }
  17. }

OSSObject には、オブジェクトのバケット、オブジェクト名、メタデータ、入力ストリームなどさまざまなオブジェクト情報が含まれます。入力ストリームを使用してオブジェクトのコンテンツを取得し、オブジェクトまたはメモリに格納できます。ObjectMetadata には、ETag、Http ヘッダー、およびオブジェクトのアップロード時に定義されたカスタムメタデータが含まれます。

GetObjectRequest を使用したオブジェクトの取得

他の関数については、GetObjectRequest を使用してオブジェクトを取得できます。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. public void GetObject(String bucketName, string key)
  4. {
  5. var getObjectRequest = new GetObjectRequest(bucketName, key);
  6. getObjectRequest.SetRange(20, 100);
  7. var o = client.GetObject(getObjectRequest);
  8. using (var requestStream = o.Content)
  9. {
  10. byte[] buf = new byte[1024];
  11. var fs = File.Open(fileToDownload, FileMode.OpenOrCreate);
  12. var len = 0;
  13. while ((len = requestStream.Read(buf, 0, 1024)) != 0)
  14. {
  15. fs.Write(buf, 0, len);
  16. }
  17. fs.Close();
  18. }
  19. }

getObjectRequest で setRange メソッドを使用してオブジェクトの範囲を返すことができます。ファイルのマルチパートダウンロードと再開可能なデータ転送にこの関数を使用できます。GetObjectRequest は次のパラメーターを設定できます。

パラメーター 説明
Range ファイル転送の範囲を指定します。
ModifiedSinceConstraint 指定された時間が実際の変更時間よりも早い場合、ファイルは通常どおり送信されます。それ以外の場合、304 Not Modified 例外がスローされます。
UnmodifiedSinceConstraint 指定された時間が実際の変更時間と同じか、実際の変更時間よりも遅い場合、ファイルは通常どおり送信されます。それ以外の場合、412 Precondition Failed 例外がスローされます。
MatchingETagConstraints ETag グループを入力します。入力した予測 ETag がオブジェクトの ETag と一致する場合、ファイルは通常どおり送信されます。それ以外の場合、412 Precondition Failed 例外がスローされます。
NonmatchingEtagConstraints ETag グループを入力します。入力した予測 ETag がオブジェクトの ETag と一致しない場合、ファイルは通常どおり送信されます。それ以外の場合、304 Not Modified 例外がスローされます。
ResponseHeaderOverrides OSS から返されるリクエストの一部のヘッダーをカスタマイズします。

ObjectMetadata のみの取得

getObjectMetadata メソッドは、オブジェクトエンティティの代わりに ObjectMetadata のみを取得するために使用できます。コードは次のとおりです。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. public void GetObjectMetadata(String bucketName, string key)
  4. {
  5. var metadata = client.GetObjectMetadata(bucketName, key);
  6. }

オブジェクトの削除

次のコードでオブジェクトは削除されます。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. public void DeleteObject(String bucketName, string key)
  4. {
  5. client.DeleteObject(bucketName, key);
  6. }

次のコードでオブジェクトはバッチ削除されます。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. var keys = new List<string>();
  4. var listResult = client.ListObjects(bucketName);
  5. foreach (var summary in listResult.ObjectSummaries)
  6. {
  7. keys.Add(summary.Key);
  8. }
  9. var request = new DeleteObjectsRequest(bucketName, keys, false);
  10. client.DeleteObjects(request);

オブジェクトのコピー

同じリージョン内で、操作権限がある 1 つのオブジェクトをコピーできます。1 GB を超える大きいオブジェクトをコピーするときは、Upload Part Copy メソッドを使用することをお勧めします。

1 つのオブジェクトのコピー

copyObject メソッドを使用すると、1 つのオブジェクトをコピーできます。コードは次のとおりです。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. var metadata = new ObjectMetadata();
  4. metadata.AddHeader("mk1", "mv1");
  5. var req = new CopyObjectRequest(sourceBucket, sourceKey, targetBucket, targetKey)
  6. {
  7. NewObjectMetadata = metadata
  8. };
  9. var ret = client.CopyObject(req);

このメソッドを使用してコピーされるオブジェクトは 1 GB 未満であることが必要です。1 GB を超えるとエラーが返されます。オブジェクトが 1 GB を超える場合は、次の Upload Part Copy メソッドを使用します。

オブジェクトメタの変更

データをコピーすると、既存のオブジェクトのメタ情報が変更される可能性があります。コピーされたソースオブジェクトのアドレスがコピー先オブジェクトのアドレスと同じである場合は、ソースオブジェクトのメタ情報が置き換えられます。

  1. // Initialize OSSClient
  2. var client = new OssClient(endpoint, accessId, accessKey);
  3. var metadata = new ObjectMetadata();
  4. metadata.ContentType = "text/html";
  5. var req = new CopyObjectRequest(sourceBucket, sourceKey, sourceBucket, sourceKey)
  6. {
  7. NewObjectMetadata = metadata
  8. };
  9. var ret = client.CopyObject(req);