OSS は、バケット内のオブジェクトを分類するためのオブジェクトタグ付けをサポートしています。同じタグを持つオブジェクトに対して、ライフサイクルルールやアクセス権限を設定できます。
オブジェクトタグ付けの詳細については、「オブジェクトタグ付け」をご参照ください。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OssClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OssClient インスタンスを作成する場合は、「初期化 (C# SDK V1)」をご参照ください。
オブジェクトタグを設定するには、
oss:PutObjectTagging権限が必要です。詳細については、「RAM ユーザーへのカスタムアクセスポリシーの付与」をご参照ください。
オブジェクトのアップロード時のオブジェクトタグの追加
次のコードは、シンプルアップロード、マルチパートアップロード、追加アップロード、および再開可能なアップロード中にオブジェクトにオブジェクトタグを追加する方法の例を示しています。
シンプルアップロード中のオブジェクトタグの追加
次のコードは、シンプルアップロード中にオブジェクトタグを追加する例を示しています。
using System.Text; using Aliyun.OSS; using System.Text; using Aliyun.OSS.Util; using Aliyun.OSS.Common; // yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 var endpoint = "yourEndpoint"; // 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // バケット名を指定します。 var bucketName = "examplebucket"; // オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 var objectName = "exampleobject.txt"; var objectContent = "More than just cloud."; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split は末尾の空の文字列を無視します。たとえば、"a/b/" は 2 つのエントリの配列として分割されます。 // そのため、末尾のスラッシュをすべて uri に追加する必要があります。 foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 const string region = "cn-hangzhou"; // ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。 var conf = new ClientConfiguration(); // Signature V4 を使用します。 conf.SignatureVersion = SignatureVersion.V4; // OssClient インスタンスを作成します。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); try { byte[] binaryData = Encoding.ASCII.GetBytes(objectContent); MemoryStream requestContent = new MemoryStream(binaryData); var meta = new ObjectMetadata(); // HTTP ヘッダーにタグ情報を設定します。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); var putRequest = new PutObjectRequest(bucketName, objectName, requestContent); putRequest.Metadata = meta; // アップロード中にファイルにタグを追加します。 client.PutObject(putRequest); Console.WriteLine("Put object succeeded"); } catch (Exception ex) { Console.WriteLine("Put object failed, {0}", ex.Message); }マルチパートアップロード中のオブジェクトタグの追加
次のコードは、マルチパートアップロード中にオブジェクトタグを追加する方法を示しています。
using Aliyun.OSS; using Aliyun.OSS.Util; using System.Text; using Aliyun.OSS.Common; // yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 var endpoint = "yourEndpoint"; // 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // バケット名を指定します。 var bucketName = "examplebucket"; // オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 var objectName = "exampleobject.txt"; // ローカルファイルの完全なパス (例: D:\\localpath\\examplefile.txt) を指定します。 ローカルパスを指定しない場合、ファイルはサンプルプログラムに対応するローカルパスからアップロードされます。 var localFilename = "D:\\localpath\\examplefile.txt"; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split は末尾の空の文字列を無視します。たとえば、"a/b/" は 2 つのエントリの配列として分割されます。 // そのため、末尾のスラッシュをすべて uri に追加する必要があります。 foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 const string region = "cn-hangzhou"; // ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。 var conf = new ClientConfiguration(); // Signature V4 を使用します。 conf.SignatureVersion = SignatureVersion.V4; // OssClient インスタンスを作成します。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); // マルチパートアップロードを初期化します。 var uploadId = ""; try { // アップロードするオブジェクトの名前と、それが属するバケットを指定します。 InitiateMultipartUploadRequest で ObjectMeta を設定できますが、ContentLength を指定する必要はありません。 var request = new InitiateMultipartUploadRequest(bucketName, objectName); var meta = new ObjectMetadata(); // HTTP ヘッダーにタグ情報を設定します。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); request.ObjectMetadata = meta; var result = client.InitiateMultipartUpload(request); uploadId = result.UploadId; // UploadId を出力します。 Console.WriteLine("Init multi part upload succeeded"); Console.WriteLine("Upload Id:{0}", result.UploadId); } catch (Exception ex) { Console.WriteLine("Init multi part upload failed, {0}", ex.Message); } // パートの総数を計算します。 var partSize = 100 * 1024; var fi = new FileInfo(localFilename); var fileSize = fi.Length; var partCount = fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } // マルチパートアップロードを開始します。 partETags は partETag を格納するリストです。 OSS は、送信されたパートリストを受信した後、各データパートの有効性を検証します。 すべてのデータパートが検証された後、OSS はこれらのパートを結合して完全なファイルを作成します。 var partETags = new List<PartETag>(); try { using (var fs = File.Open(localFilename, FileMode.Open)) { for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; // 現在のアップロードの開始位置に移動します。 fs.Seek(skipBytes, 0); // アップロードするパートのサイズを計算します。 最後のパートは残りのデータです。 var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); var request = new UploadPartRequest(bucketName, objectName, uploadId) { InputStream = fs, PartSize = size, PartNumber = i + 1 }; // UploadPart 操作を呼び出してパートをアップロードします。 戻り値にはパートの ETag が含まれます。 var result = client.UploadPart(request); partETags.Add(result.PartETag); Console.WriteLine("finish {0}/{1}", partETags.Count, partCount); } Console.WriteLine("Put multi part upload succeeded"); } } catch (Exception ex) { Console.WriteLine("Put multi part upload failed, {0}", ex.Message); } // マルチパートアップロードを完了します。 try { var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId); foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var result = client.CompleteMultipartUpload(completeMultipartUploadRequest); Console.WriteLine("complete multi part succeeded"); } catch (Exception ex) { Console.WriteLine("complete multi part failed, {0}", ex.Message); }追加アップロード中のオブジェクトタグの追加
次のコードは、追加アップロード中にオブジェクトタグを追加する方法を示しています。
using Aliyun.OSS; using Aliyun.OSS.Util; using System.Text; using Aliyun.OSS.Common; // yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 var endpoint = "yourEndpoint"; // 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // バケット名を指定します。 var bucketName = "examplebucket"; // オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 var objectName = "exampleobject.txt"; // ローカルファイルの完全なパス (例: D:\\localpath\\examplefile.txt) を指定します。 ローカルパスを指定しない場合、ファイルはサンプルプログラムに対応するローカルパスからアップロードされます。 var localFilename = "D:\\localpath\\examplefile.txt"; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split は末尾の空の文字列を無視します。たとえば、"a/b/" は 2 つのエントリの配列として分割されます。 // そのため、末尾のスラッシュをすべて uri に追加する必要があります。 foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 const string region = "cn-hangzhou"; // ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。 var conf = new ClientConfiguration(); // Signature V4 を使用します。 conf.SignatureVersion = SignatureVersion.V4; // OssClient インスタンスを作成します。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); // 最初の追加の位置は 0 です。 戻り値は、次の追加の位置です。 後続の追加はファイルの末尾から開始されます。 long position = 0; try { var metadata = client.GetObjectMetadata(bucketName, objectName); position = metadata.ContentLength; } catch (Exception) { } try { using (var fs = File.Open(localFilename, FileMode.Open)) { var request = new AppendObjectRequest(bucketName, objectName) { ObjectMetadata = new ObjectMetadata(), Content = fs, Position = position }; var meta = new ObjectMetadata(); // HTTP ヘッダーにタグ情報を設定します。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); request.ObjectMetadata = meta; // 最初の追加。 最初の追加アップロード中に設定されたタグのみが有効になります。 var result = client.AppendObject(request); // ファイルの追加位置を設定します。 position = result.NextAppendPosition; Console.WriteLine("Append object succeeded, next append position:{0}", position); } // 追加位置を取得し、ファイルを再度追加します。 using (var fs = File.Open(localFilename, FileMode.Open)) { var request = new AppendObjectRequest(bucketName, objectName) { ObjectMetadata = new ObjectMetadata(), Content = fs, Position = position }; var result = client.AppendObject(request); position = result.NextAppendPosition; Console.WriteLine("Append object succeeded, next append position:{0}", position); } } catch (Exception ex) { Console.WriteLine("Append object failed, {0}", ex.Message); }再開可能なアップロード中のオブジェクトタグの追加
次のコードは、再開可能なアップロード中にオブジェクトタグを追加する方法を示しています。
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Util; using System.Text; // yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 var endpoint = "yourEndpoint"; // 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // バケット名を指定します。 var bucketName = "examplebucket"; // オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 var objectName = "exampleobject.txt"; // ローカルファイルの完全なパス (例: D:\\localpath\\examplefile.txt) を指定します。 ローカルパスを指定しない場合、ファイルはサンプルプログラムに対応するローカルパスからアップロードされます。 var localFilename = "D:\\localpath\\examplefile.txt"; // マルチパートアップロードの結果を記録するファイル。 アップロードの進行状況はこのファイルに保存されます。 string checkpointDir = "yourCheckpointDir"; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split は末尾の空の文字列を無視します。たとえば、"a/b/" は 2 つのエントリの配列として分割されます。 // そのため、末尾のスラッシュをすべて uri に追加する必要があります。 foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 const string region = "cn-hangzhou"; // ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。 var conf = new ClientConfiguration(); // Signature V4 を使用します。 conf.SignatureVersion = SignatureVersion.V4; // OssClient インスタンスを作成します。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); try { // UploadFileRequest を介して複数のパラメーターを設定します。 UploadObjectRequest request = new UploadObjectRequest(bucketName, objectName, localFilename) { // 各パートのサイズを指定します。 PartSize = 8 * 1024 * 1024, // 同時実行スレッド数を指定します。 ParallelThreadCount = 3, // checkpointDir は、ローカルのマルチパートアップロードの結果を記録するファイルを指定します。 アップロードの進行状況はこのファイルに保存されます。 パートのアップロードに失敗した場合、アップロードは記録されたブレークポイントから再開されます。 checkpointDir が null に設定されている場合、再開可能なアップロード機能は無効になります。 アップロードが失敗した場合、最初から再開されます。 CheckpointDir = checkpointDir, }; var meta = new ObjectMetadata(); // HTTP ヘッダーにタグ情報を設定します。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); request.Metadata = meta; // 再開可能なアップロードを実行します。 client.ResumableUploadObject(request); Console.WriteLine("Resumable upload object:{0} succeeded", objectName); } catch (OssException ex) { Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}", ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } catch (Exception ex) { Console.WriteLine("Failed with error info: {0}", ex.Message); }
アップロード済みオブジェクトのオブジェクトタグの追加または変更
次のコードは、既存のオブジェクトのオブジェクトタグを追加または変更する方法を示しています。
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。
var objectName = "exampleobject.txt";
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// Signature V4 を使用します。
conf.SignatureVersion = SignatureVersion.V4;
// OssClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// タグ情報を設定します。
var setRequest = new SetObjectTaggingRequest(bucketName, objectName);
var tag1 = new Tag
{
Key = "project",
Value = "projectone"
};
var tag2 = new Tag
{
Key = "user",
Value = "jsmith"
};
setRequest.AddTag(tag1);
setRequest.AddTag(tag2);
client.SetObjectTagging(setRequest);
Console.WriteLine("set object tagging succeeded");
}
catch (Exception ex)
{
Console.WriteLine("set object tagging failed. {0}", ex.Message);
}オブジェクトのコピー時のオブジェクトタグの設定
オブジェクトをコピーするときに、コピー先オブジェクトのタグをどのように設定するかを指定できます。有効な値は次のとおりです:
コピー (デフォルト):コピー元オブジェクトからコピー先オブジェクトにタグをコピーします。
置き換え:コピー元オブジェクトのタグを無視し、リクエストで指定されたタグをコピー先オブジェクトに適用します。
次のコードは、1 GB 未満のオブジェクトにはシンプルコピー操作、1 GB 以上のオブジェクトにはマルチパートコピー操作を使用してオブジェクトをコピーする際に、オブジェクトタグを設定する方法の例を示しています。
次のコードは、1 GB 未満のオブジェクトをコピーする際にオブジェクトタグを設定する方法を示しています:
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Util; using System.Text; // yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 var endpoint = "yourEndpoint"; // 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // コピー元バケットの名前 (例: srcexamplebucket) を指定します。 var sourceBucket = "srcexamplebucket"; // コピー元オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 例:srcdir/scrobject.txt。 var sourceObject = "srcdir/scrobject.txt"; // コピー先バケットの名前を指定します。これはコピー元バケットと同じリージョンにある必要があります。 例:destbucket。 var targetBucket = "destbucket"; // コピー先オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 例:destdir/destobject.txt。 var targetObject = "destdir/destobject.txt"; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split は末尾の空の文字列を無視します。たとえば、"a/b/" は 2 つのエントリの配列として分割されます。 // そのため、末尾のスラッシュをすべて uri に追加する必要があります。 foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 const string region = "cn-hangzhou"; // ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。 var conf = new ClientConfiguration(); // Signature V4 を使用します。 conf.SignatureVersion = SignatureVersion.V4; // OssClient インスタンスを作成します。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); try { var metadata = new ObjectMetadata(); metadata.AddHeader("mk1", "mv1"); metadata.AddHeader("mk2", "mv2"); // HTTP ヘッダーにタグ情報を設定します。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); metadata.AddHeader("x-oss-tagging", str); var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject) { // NewObjectMetadata が null の場合、コピーモードが使用されます。これは、コピー元ファイルのメタデータがコピーされることを意味します。 NewObjectMetadata が null でない場合、置き換えモードが使用されます。これは、コピー元ファイルのメタデータが上書きされることを意味します。 NewObjectMetadata = metadata }; // ファイルをコピーします。 client.CopyObject(req); Console.WriteLine("Copy object succeeded"); } catch (OssException ex) { Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}", ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } catch (Exception ex) { Console.WriteLine("Failed with error info: {0}", ex.Message); }次のコードは、マルチパートコピーを使用して 1 GB を超えるオブジェクトをコピーする際にオブジェクトタグを設定する方法を示しています:
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Util; using System.Text; // yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 var endpoint = "yourEndpoint"; // 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // コピー元バケットの名前 (例: srcexamplebucket) を指定します。 var sourceBucket = "srcexamplebucket"; // コピー元オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 例:srcdir/scrobject.txt。 var sourceObject = "srcdir/scrobject.txt"; // コピー先バケットの名前を指定します。これはコピー元バケットと同じリージョンにある必要があります。 例:destbucket。 var targetBucket = "destbucket"; // コピー先オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。 例:destdir/destobject.txt。 var targetObject = "destdir/destobject.txt"; var uploadId = ""; var partSize = 50 * 1024 * 1024; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split は末尾の空の文字列を無視します。たとえば、"a/b/" は 2 つのエントリの配列として分割されます。 // そのため、末尾のスラッシュをすべて uri に追加する必要があります。 foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 const string region = "cn-hangzhou"; // ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。 var conf = new ClientConfiguration(); // Signature V4 を使用します。 conf.SignatureVersion = SignatureVersion.V4; // OssClient インスタンスを作成します。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); try { // コピータスクを初期化します。 InitiateMultipartUploadRequest を使用して、コピー先オブジェクトのメタデータを指定できます。 var request = new InitiateMultipartUploadRequest(targetBucket, targetObject); var meta = new ObjectMetadata(); // HTTP ヘッダーにタグ情報を設定します。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); request.ObjectMetadata = meta; var result = client.InitiateMultipartUpload(request); // uploadId を出力します。 uploadId = result.UploadId; Console.WriteLine("Init multipart upload succeeded, Upload Id: {0}", result.UploadId); // パート数を計算します。 var metadata = client.GetObjectMetadata(sourceBucket, sourceObject); var fileSize = metadata.ContentLength; var partCount = (int)fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } // マルチパートコピーを開始します。 var partETags = new List<PartETag>(); for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); // UploadPartCopyRequest を作成し、リクエストで条件を指定します。 var uploadPartCopyRequest = new UploadPartCopyRequest(targetBucket, targetObject, sourceBucket, sourceObject, uploadId) { PartSize = size, PartNumber = i + 1, // BeginIndex は、コピーするパートの開始位置を指定します。 BeginIndex = skipBytes }; // uploadPartCopy メソッドを呼び出して各パートをコピーします。 var uploadPartCopyResult = client.UploadPartCopy(uploadPartCopyRequest); Console.WriteLine("UploadPartCopy : {0}", i); partETags.Add(uploadPartCopyResult.PartETag); } // マルチパートコピーを完了します。 var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(targetBucket, targetObject, uploadId); // partETags は、マルチパートアップロード中に保存された partETag のリストです。 OSS は、送信されたリストを受信した後、各データパートの有効性を検証します。 すべてのパートが検証された後、OSS はそれらを結合して完全なファイルを作成します。 foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var completeMultipartUploadResult = client.CompleteMultipartUpload(completeMultipartUploadRequest); Console.WriteLine("CompleteMultipartUpload succeeded"); } catch (OssException ex) { Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}", ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } catch (Exception ex) { Console.WriteLine("Failed with error info: {0}", ex.Message); }
シンボリックリンクのタグの設定
次のコードは、シンボリックリンクにオブジェクトタグを設定する方法を示しています。
using Aliyun.OSS;
using Aliyun.OSS.Util;
using System.Text;
using Aliyun.OSS.Common;
// yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。
var targetObjectName = "exampleobject.txt";
// シンボリックリンクの名前 (例: symlink.txt) を指定します。
var symlinkObjectName = "symlink.txt";
var objectContent = "More than just cloud.";
String UrlEncodeKey(String key)
{
const string CharsetName = "utf-8";
const char separator = '/';
var segments = key.Split(separator);
var encodedKey = new StringBuilder();
encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName));
for (var i = 1; i < segments.Length; i++)
encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName));
if (key.EndsWith(separator.ToString()))
{
// String#split は末尾の空の文字列を無視します。たとえば、"a/b/" は 2 つのエントリの配列として分割されます。
// そのため、末尾のスラッシュをすべて uri に追加する必要があります。
foreach (var ch in key)
{
if (ch == separator)
encodedKey.Append(separator);
else
break;
}
}
return encodedKey.ToString();
}
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// Signature V4 を使用します。
conf.SignatureVersion = SignatureVersion.V4;
// OssClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// ターゲットオブジェクトをアップロードします。
byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
MemoryStream requestContent = new MemoryStream(binaryData);
client.PutObject(bucketName, targetObjectName, requestContent);
var meta = new ObjectMetadata();
// HTTP ヘッダーにタグ情報を設定します。
string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2");
meta.AddHeader("x-oss-tagging", str);
var request = new CreateSymlinkRequest(bucketName, symlinkObjectName, targetObjectName);
request.ObjectMetadata = meta;
// シンボリックリンクを作成します。
client.CreateSymlink(request);
// シンボリックリンクが指すターゲットオブジェクトの名前を取得します。
var ossSymlink = client.GetSymlink(bucketName, symlinkObjectName);
Console.WriteLine("Target object is {0}", ossSymlink.Target);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}関連ドキュメント
オブジェクトタグを設定するために使用される API 操作の詳細については、「PutObjectTagging」をご参照ください。