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

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

以下のタスクは、Java SDK を使用してコピー元ロケーションから別のロケーション(例えば、あるバケットから別のバケット)に Amazon Amazon S3 オブジェクトをコピーする手順を示しています。ここに示すコードを使用して、5 GB よりも大きいオブジェクトをコピーできます。5 GB よりも小さいオブジェクトには、1 回のコピーオペレーションを使用します (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; } }