このトピックでは、バケット内または同じリージョン内のバケット間でオブジェクトをコピーする方法について説明します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 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を使用してパーツを順番にコピーする必要があります。 マルチパートコピーを実装するには、次の手順を実行します。
InitiateMultipartUploadRequestメソッドを呼び出して、マルチパートコピータスクを開始します。
マルチパートコピーを実行するには、UploadPartCopyメソッドを呼び出します。
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』をご参照ください。