메뉴
Amazon Simple Storage Service
개발자 안내서 (API Version 2006-03-01)

.NET용 AWS SDK 멀티파트 업로드 API를 사용한 객체 복사

다음 작업은 .NET SDK를 사용하여 Amazon S3 객체를 하나의 소스 위치에서 다른 위치(예: 한 버킷에서 다른 버킷으로)로 복사합니다. 이 코드를 사용하여 5GB보다 큰 객체를 복사할 수 있습니다. 5GB보다 작은 객체는 .NET용 AWS SDK를 사용하여 객체 복사에 설명된 단일 작업 복사를 사용하십시오.

객체 복사

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; } } }