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

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

다음 작업은 Java SDK를 사용하여 버킷과 마찬가지로 하나의 소스 위치에서 다른 곳으로 Amazon S3 객체를 복사하는 방법을 보여 줍니다. 여기에서 보여 준 코드를 사용하여 5GB보다 큰 객체를 복사할 수 있습니다. 5GB보다 작은 객체는 AWS SDK for Java를 사용하여 객체 복사에 설명된 단일 작업 복사를 사용하십시오.

객체 복사

1

AWS 자격 증명을 제공하여 AmazonS3Client 클래스의 인스턴스를 만듭니다.

2

AmazonS3Client.initiateMultipartUpload 메서드를 실행하여 멀티파트 복사를 시작합니다. InitiateMultipartUploadRequest의 인스턴스를 만듭니다. 버킷 이름과 키 이름을 제공해야 합니다.

3

AmazonS3Client.initiateMultipartUpload 메서드가 반환하는 응답 객체에서 업로드 ID를 저장합니다. 이후의 멀티파트 업로드 작업에서 이 업로드 ID를 제공해야 합니다.

4

모든 파트를 복사합니다. 각 파트 복사에 대해, CopyPartRequest 클래스의 새로운 인스턴스를 만들고 파트 정보(소스 버킷, 대상 버킷, 객체 키, 업로드 ID, 파트의 첫 번째 바이트, 파트의 마지막 바이트, 파트 번호 등)를 제공합니다.

5

목록의 CopyPartRequest 메서드에 대한 응답을 저장합니다. 응답은 ETag 값과 파트 번호로 이루어져 있습니다. 멀티파트 업로드를 완료하려면 파트 번호가 필요합니다.

6

각 파트에 대해 4-5 작업을 반복합니다.

7

AmazonS3Client.completeMultipartUpload 메서드를 실행하여 복사를 완료합니다.

다음은 위에서 설명한 작업을 실행하는 Java 코드 샘플입니다.

Copy
// Step 1: Create instance and provide credentials. AmazonS3Client s3Client = new AmazonS3Client(new PropertiesCredentials( LowLevel_LargeObjectCopy.class.getResourceAsStream( "AwsCredentials.properties"))); // Create lists to hold copy responses List<CopyPartResult> copyResponses = new ArrayList<CopyPartResult>(); // Step 2: Initialize InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest(targetBucketName, targetObjectKey); InitiateMultipartUploadResult initResult = s3Client.initiateMultipartUpload(initiateRequest); // Step 3: Save upload Id. String uploadId = initResult.getUploadId(); try { // Get object size. GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(sourceBucketName, sourceObjectKey); ObjectMetadata metadataResult = s3Client.getObjectMetadata(metadataRequest); long objectSize = metadataResult.getContentLength(); // in bytes // Step 4. Copy parts. long partSize = 5 * (long)Math.pow(2.0, 20.0); // 5 MB long bytePosition = 0; for (int i = 1; bytePosition < objectSize; i++) { // Step 5. Save copy response. CopyPartRequest copyRequest = new CopyPartRequest() .withDestinationBucketName(targetBucketName) .withDestinationKey(targetObjectKey) .withSourceBucketName(sourceBucketName) .withSourceKey(sourceObjectKey) .withUploadId(initResult.getUploadId()) .withFirstByte(bytePosition) .withLastByte(bytePosition + partSize -1 >= objectSize ? objectSize - 1 : bytePosition + partSize - 1) .withPartNumber(i); copyResponses.add(s3Client.copyPart(copyRequest)); bytePosition += partSize; } // Step 7. Complete copy operation. CompleteMultipartUploadResult completeUploadResponse = s3Client.completeMultipartUpload(completeRequest); } catch (Exception e) { System.out.println(e.getMessage()); }

다음 Java 코드 예제는 하나의 Amazon S3 버킷에서 다른 버킷으로 객체를 복사합니다. 실제 예제를 작성하여 테스트하는 방법에 대한 자세한 내용은 Java 코드 예제 테스트를 참조하십시오.

Copy
import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.amazonaws.auth.PropertiesCredentials; import com.amazonaws.services.s3.*; import com.amazonaws.services.s3.model.*; public class LowLevel_LargeObjectCopy { public static void main(String[] args) throws IOException { String sourceBucketName = "*** Source-Bucket-Name ***"; String targetBucketName = "*** Target-Bucket-Name ***"; String sourceObjectKey = "*** Source-Object-Key ***"; String targetObjectKey = "*** Target-Object-Key ***"; AmazonS3Client s3Client = new AmazonS3Client(new PropertiesCredentials( LowLevel_LargeObjectCopy.class.getResourceAsStream( "AwsCredentials.properties"))); // List to store copy part responses. List<CopyPartResult> copyResponses = new ArrayList<CopyPartResult>(); InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest(targetBucketName, targetObjectKey); InitiateMultipartUploadResult initResult = s3Client.initiateMultipartUpload(initiateRequest); try { // Get object size. GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(sourceBucketName, sourceObjectKey); ObjectMetadata metadataResult = s3Client.getObjectMetadata(metadataRequest); long objectSize = metadataResult.getContentLength(); // in bytes // Copy parts. long partSize = 5 * (long)Math.pow(2.0, 20.0); // 5 MB long bytePosition = 0; for (int i = 1; bytePosition < objectSize; i++) { CopyPartRequest copyRequest = new CopyPartRequest() .withDestinationBucketName(targetBucketName) .withDestinationKey(targetObjectKey) .withSourceBucketName(sourceBucketName) .withSourceKey(sourceObjectKey) .withUploadId(initResult.getUploadId()) .withFirstByte(bytePosition) .withLastByte(bytePosition + partSize -1 >= objectSize ? objectSize - 1 : bytePosition + partSize - 1) .withPartNumber(i); copyResponses.add(s3Client.copyPart(copyRequest)); bytePosition += partSize; } CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest( targetBucketName, targetObjectKey, initResult.getUploadId(), GetETags(copyResponses)); CompleteMultipartUploadResult completeUploadResponse = s3Client.completeMultipartUpload(completeRequest); } catch (Exception e) { System.out.println(e.getMessage()); } } // Helper function that constructs ETags. static List<PartETag> GetETags(List<CopyPartResult> responses) { List<PartETag> etags = new ArrayList<PartETag>(); for (CopyPartResult response : responses) { etags.add(new PartETag(response.getPartNumber(), response.getETag())); } return etags; } }