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

Object Storage Service:オブジェクトのコピー

最終更新日:Dec 19, 2023

このトピックでは、バケット内または同じリージョン内のバケット間でオブジェクトをコピーする方法について説明します。

使用上の注意

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

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

  • オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、宛先バケットに対する読み取りおよび書き込み権限が必要です。

  • ソースバケットとターゲットバケットに保持ポリシーが設定されていないことを確認します。 それ以外の場合、エラーメッセージ指定したオブジェクトは不変です。 が返されます。

  • ソースバケットと宛先バケットは同じリージョンにある必要があります。 たとえば、中国 (杭州) リージョンにあるバケットから中国 (青島) リージョンにある別のバケットにオブジェクトをコピーすることはできません。

小さなオブジェクトをコピーする

次のコードは、小さなオブジェクトをコピーする方法の例を示しています。

Aliyun.OSSを使用した

Aliyun.OSS.Common; を使用

// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、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";

// OSSClientインスタンスを作成します。 
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
トライ
{
    var metadata = new ObjectMetadata();
    // ユーザーメタデータを指定します。 ユーザーメタデータは、キーと値のペアとして保存されます。 たとえば、キーはmk1で、値はmv1です。 
    metadata.AddHeader("mk1", "mv1");
    metadata.AddHeader("mk2", "mv2");
    var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject)
    {
        // NewObjectMetadataの値がnullの場合、COPYモードが使用され、ソースオブジェクトのメタデータがターゲットオブジェクトにコピーされます。 NewObjectMetadataの値がnullでない場合、REPLACEモードが使用され、ターゲットオブジェクトのメタデータがリクエストで指定されたメタデータによって上書きされます。 
        NewObjectMetadata = metadata 
    };
    // オブジェクトをコピーします。 
    client.CopyObject(req);
    Console.WriteLine("オブジェクトのコピー成功");
}
キャッチ (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; エラー情報: {1} 。 \nRequestID: {2} \tHostID: {3}"、
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
キャッチ (例外ex)
{
    Console.WriteLine("Failed with error info: {0}" 、メッセージなど);
} 

大きなオブジェクトをコピーする

  • マルチパートコピーを使用したオブジェクトのコピー

    サイズが1 GBを超えるオブジェクトをコピーするには、オブジェクトをパーツに分割し、UploadPartCopyを使用してパーツを順番にコピーする必要があります。 マルチパートコピーを実装するには、次の手順を実行します。

    1. InitiateMultipartUploadRequestメソッドを呼び出して、マルチパートコピータスクを開始します。

    2. マルチパートコピーを実行するには、UploadPartCopyメソッドを呼び出します。

    3. CompleteMultipartUploadメソッドを呼び出して、マルチパートコピータスクを完了します。

    次のコードは、マルチパートコピーを実行する方法の例を示しています。

    Aliyun.OSSを使用した
    
    Aliyun.OSS.Common; を使用
    // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
    var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、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;
    // OSSClientインスタンスを作成します。 
    var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
    トライ
    {
        // マルチパートコピータスクを開始します。 InitiateMultipartUploadRequest操作を呼び出して、宛先オブジェクトのメタデータを指定できます。 
        var request = new InitiateMultipartUploadRequest(targetBucket, targetObject);
        var result = client.InitiateMultipartUpload(request);
        // アップロードIDを表示します。 
        uploadId = result.UploadId;
        Console.WriteLine("Init multipart upload successful, Upload Id: {0}", result.UploadId);
        // Calculate the total number of parts. 
        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はpartETagsのリストです。 OSSは、partETagsを受け取った後、各パーツの有効性を検証します。 すべての部品が検証された後、OSSはこれらの部品を完全なオブジェクトに結合します。 
        foreach (var partETag in partETags)
        {
            completeMultipartUploadRequest.PartETags.Add(partETag);
        }
        var completeMultipartUploadResult = client.CompleteMultipartUpload(completeMultipartUploadRequest);
        Console.WriteLine("CompleteMultipartUpload successed");
    }
    キャッチ (OssException ex)
    {
        Console.WriteLine("Failed with error code: {0}; エラー情報: {1} 。 \nRequestID: {2} \tHostID: {3}"、
            ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
    }
    キャッチ (例外ex)
    {
        Console.WriteLine("Failed with error info: {0}" 、メッセージなど);
    } 
  • 再開可能コピー

    再開可能なコピータスクが中断された場合は、コピータスクを続行できます。

    次のコードは、再開可能コピーを使用してオブジェクトをコピーする方法の例を示しています。

    Aliyun.OSSを使用した
    
    // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
    var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、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 checkpointDir = @ "yourCheckpointDir";
    // OSSClientインスタンスを作成します。 
    var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
    トライ
    {
        var request = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject);
        // チェックポイントファイルが格納されているcheckpointDirディレクトリを指定します。 チェックポイントファイルは、再開可能なコピータスクの状態を記録し、失敗の場合にタスクを再開するために使用することができる。 checkpointDirをnullに設定すると、再開可能なコピーは有効になりません。コピーに失敗した場合は、オブジェクトを最初から再度コピーする必要があります。 
        client.ResumableCopyObject(request, checkpointDir);
        Console.WriteLine("Resumable copy new object:{0} successed", request.DestinationKey);
    }
    キャッチ (例外ex)
    {
        Console.WriteLine("Resumable copy new object failed, {0}", ex.Message);
    } 

参考資料

  • 小さなオブジェクトをコピーする

    • 小さなオブジェクトのコピーに使用される完全なサンプルコードについては、GitHubをご覧ください。

    • 小さなオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「CopyObject」をご参照ください。

  • 大きなオブジェクトをコピーする

    • ラージオブジェクトのコピーに使用される完全なサンプルコードについては、GitHubをご覧ください。

    • ラージオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「UploadPartCopy」をご参照ください。

  • 再開可能コピー

    再開可能コピーの実行に使用される完全なサンプルコードについては、『GitHub』をご参照ください。