メニュー
Amazon Simple Storage Service
開発者ガイド (API Version 2006-03-01)

AWS SDK for .NET マルチパートアップロード API を使用したオブジェクトのコピー

以下のタスクは、.NET SDK を使用してコピー元ロケーションから別のロケーション(例えば、あるバケットから別のバケット)に Amazon Amazon S3 オブジェクトをコピーする手順を示しています。ここに示すコード例を使用して、5 GB よりも大きいオブジェクトをコピーできます。5 GB よりも小さいオブジェクトには、1 回のコピーオペレーションを使用します (AWS SDK for .NET を使用したオブジェクトのコピーを参照)。

オブジェクトのコピー

1

AWS 認証情報を指定して、AmazonS3Client クラスのインスタンスを作成します。

2

AmazonS3Client.InitiateMultipartUpload メソッドを実行してマルチパートコピーを開始します。InitiateMultipartUploadRequest のインスタンスを作成します。バケット名とキー名を指定する必要があります。

3

AmazonS3Client.InitiateMultipartUpload メソッドから返されたレスポンスオブジェクトのアップロード ID を保存します。以降、マルチパートアップロードオペレーションのたびに、このアップロード ID を指定する必要があります。

4

すべてのパートをコピーします。パートのコピーごとに、CopyPartRequest クラスの新しいインスタンスを作成し、パート情報(コピー元バケット、コピー先バケット、オブジェクトキー、アップロード ID、パートの先頭バイト、パートの最終バイト、パート番号)を指定します。

5

CopyPartRequest メソッドのレスポンスをリストに保存します。レスポンスには、マルチパートアップロードを完了するために必要な ETag 値とパート番号が含まれています。

6

各パートについてタスク 4 と 5 を繰り返します。

7

AmazonS3Client.CompleteMultipartUpload メソッドを実行してコピーを完了します。

以下の C# コード例は、前述のタスクの例です。

Copy
// Step 1. Create instance and provide credentials. IAmazonS3 s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); // List to store upload part responses. List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>(); List<CopyPartResponse> copyResponses = new List<CopyPartResponse>(); InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest { BucketName = targetBucket, Key = targetObjectKey }; // Step 2. Initialize. InitiateMultipartUploadResponse initResponse = s3Client.InitiateMultipartUpload(initiateRequest); // Step 3. Save Upload Id. String uploadId = initResponse.UploadId; try { // Get object size. GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest { BucketName = sourceBucket, Key = sourceObjectKey }; GetObjectMetadataResponse metadataResponse = s3Client.GetObjectMetadata(metadataRequest); long objectSize = metadataResponse.ContentLength; // in bytes // Copy parts. long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB long bytePosition = 0; for (int i = 1; bytePosition < objectSize; i++) { CopyPartRequest copyRequest = new CopyPartRequest { DestinationBucket = targetBucket, DestinationKey = targetObjectKey, SourceBucket = sourceBucket, SourceKey = sourceObjectKey, UploadId = uploadId, FirstByte = bytePosition, LastByte = bytePosition + partSize - 1 >= objectSize ? objectSize - 1 : bytePosition + partSize - 1, PartNumber = i }; copyResponses.Add(s3Client.CopyPart(copyRequest)); bytePosition += partSize; } CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest { BucketName = targetBucket, Key = targetObjectKey, UploadId = initResponse.UploadId }; completeRequest.AddPartETags(copyResponses); CompleteMultipartUploadResponse completeUploadResponse = s3Client.CompleteMultipartUpload(completeRequest); } catch (Exception e) { Console.WriteLine(e.Message); }

次の C# コード例では、ある Amazon S3 バケットから別のバケットにオブジェクトをコピーします。作業サンプルを作成およびテストする方法については、「Amazon S3 .NET コード例の実行」を参照してください。

Copy
using System; using System.Collections.Generic; using Amazon.S3; using Amazon.S3.Model; namespace s3.amazon.com.docsamples { class CopyObjectUsingMPUapi { static string sourceBucket = "*** Source bucket name ***"; static string targetBucket = "*** Target bucket name ***"; static string sourceObjectKey = "*** Source object key ***"; static string targetObjectKey = "*** Target object key ***"; static void Main(string[] args) { IAmazonS3 s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); // List to store upload part responses. List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>(); List<CopyPartResponse> copyResponses = new List<CopyPartResponse>(); InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest { BucketName = targetBucket, Key = targetObjectKey }; InitiateMultipartUploadResponse initResponse = s3Client.InitiateMultipartUpload(initiateRequest); String uploadId = initResponse.UploadId; try { // Get object size. GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest { BucketName = sourceBucket, Key = sourceObjectKey }; GetObjectMetadataResponse metadataResponse = s3Client.GetObjectMetadata(metadataRequest); long objectSize = metadataResponse.ContentLength; // in bytes // Copy parts. long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB long bytePosition = 0; for (int i = 1; bytePosition < objectSize; i++) { CopyPartRequest copyRequest = new CopyPartRequest { DestinationBucket = targetBucket, DestinationKey = targetObjectKey, SourceBucket = sourceBucket, SourceKey = sourceObjectKey, UploadId = uploadId, FirstByte = bytePosition, LastByte = bytePosition + partSize - 1 >= objectSize ? objectSize - 1 : bytePosition + partSize - 1, PartNumber = i }; copyResponses.Add(s3Client.CopyPart(copyRequest)); bytePosition += partSize; } CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest { BucketName = targetBucket, Key = targetObjectKey, UploadId = initResponse.UploadId }; completeRequest.AddPartETags(copyResponses); CompleteMultipartUploadResponse completeUploadResponse = s3Client.CompleteMultipartUpload(completeRequest); } catch (Exception e) { Console.WriteLine(e.Message); } } // Helper function that constructs ETags. static List<PartETag> GetETags(List<CopyPartResponse> responses) { List<PartETag> etags = new List<PartETag>(); foreach (CopyPartResponse response in responses) { etags.Add(new PartETag(response.PartNumber, response.ETag)); } return etags; } } }