すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:オブジェクトタグの設定

最終更新日:Feb 24, 2025

Object Storage Service (OSS) では、オブジェクトタグを設定してオブジェクトを分類できます。 タグに基づいてライフサイクルルールを設定し、オブジェクトへのアクセスを制御できます。

説明

オブジェクトタグの詳細については、「オブジェクトへのタグ付け」をご参照ください。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用しています。 OSS と同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。 OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。 カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化」をご参照ください。

  • オブジェクトにタグを追加するには、oss:PutObjectTagging 権限が必要です。 詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。

オブジェクトのアップロード時にオブジェクトにタグを追加する

次の例では、シンプルアップロード、マルチパートアップロード、アペンドアップロード、および再開可能なアップロードを使用してオブジェクトをアップロードするときに、オブジェクトにタグを追加する方法について説明します。

  • シンプルアップロードを使用してオブジェクトをアップロードするときに、オブジェクトにタグを追加する

    次のサンプルコードは、シンプルアップロードを使用してオブジェクトをアップロードするときに、オブジェクトにタグを追加する方法の例を示しています。

    using System.Text;
    using Aliyun.OSS;
    using System.Text;
    using Aliyun.OSS.Util;
    using Aliyun.OSS.Common;
    
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();
    
    // 署名アルゴリズム 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;
    
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();
    
    // 署名アルゴリズム V4 を使用します。
    conf.SignatureVersion = SignatureVersion.V4;
    
    // OSSClient インスタンスを作成します。
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
    client.SetRegion(region);
    // マルチパートアップロードタスクを開始します。
    var uploadId = "";
    try
    {
        // オブジェクトの名前と、オブジェクトのアップロード先となるバケットを指定します。InitiateMultipartUploadRequest でオブジェクトメタデータを設定できます。ただし、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;
        // アップロード ID を表示します。
        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 はパート ETag のリストです。 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;
    
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();
    
    // 署名アルゴリズム 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);
        }
        // 次の追加操作の位置を取得し、2 番目の追加操作を実行します。
        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;
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();
    
    // 署名アルゴリズム 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;

// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();

// 署名アルゴリズム 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;
    
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();
    
    // 署名アルゴリズム 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 = 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;
    
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();
    
    // 署名アルゴリズム 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);
        // アップロード ID を表示します。
        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 オブジェクトを作成します。 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 は、partETags を受信した後、各パートの有効性を検証します。すべてのパートが検証されると、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;

// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();

// 署名アルゴリズム 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」をご参照ください。