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

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

AWS SDK for Java で 5 GB を超える Amazon S3 オブジェクトをコピーするには、低レベルの Java API を使用します。5 GB 未満のオブジェクトには、1 回のコピーオペレーションを使用します (「AWS SDK for Java を使用したオブジェクトのコピー」を参照)。

低レベルの Java API を使用してオブジェクトをコピーするには、次の手順に従います。

  • AmazonS3Client.initiateMultipartUpload() メソッドを実行して、マルチパートアップロードを開始します。

  • AmazonS3Client.initiateMultipartUpload() メソッドから返されたレスポンスオブジェクトのアップロード ID を保存します。このアップロード ID は、パートのアップロードオペレーションごとに指定します。

  • すべてのパートをコピーします。コピーする必要があるパートごとに、CopyPartRequest クラスの新しいインスタンスを作成します。パート情報として、送信元と送信先のバケット名、送信元と送信先のオブジェクトキー、アップロード ID、パートの最初と最後のバイトの場所、パート番号などを指定します。

  • AmazonS3Client.copyPart() メソッド呼び出しのレスポンスを保存します。各レスポンスには、アップロードしたパートの ETag 値とパート番号が含まれています。この情報は、マルチパートアップロードを完了するために必要です。

  • AmazonS3Client.completeMultipartUpload() メソッドを呼び出してコピーオペレーションを完了します。

次の例では、Amazon S3 の低レベル Java API を使用してマルチパートコピーを実行する方法を示します。有効な例を作成してテストする方法については、「Amazon S3 Java コード例のテスト」を参照してください。

import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.*; import com.amazonaws.services.s3.model.*; public class LowLevelMultipartCopy { public static void main(String[] args) throws IOException { String clientRegion = "*** Client region ***"; String sourceBucketName = "*** Source bucket name ***"; String sourceObjectKey = "*** Source object key ***"; String destBucketName = "*** Target bucket name ***"; String destObjectKey = "*** Target object key ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Initiate the multipart upload. InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(destBucketName, destObjectKey); InitiateMultipartUploadResult initResult = s3Client.initiateMultipartUpload(initRequest); // Get the object size to track the end of the copy operation. GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(sourceBucketName, sourceObjectKey); ObjectMetadata metadataResult = s3Client.getObjectMetadata(metadataRequest); long objectSize = metadataResult.getContentLength(); // Copy the object using 5 MB parts. long partSize = 5 * 1024 * 1024; long bytePosition = 0; int partNum = 1; List<CopyPartResult> copyResponses = new ArrayList<CopyPartResult>(); while (bytePosition < objectSize) { // The last part might be smaller than partSize, so check to make sure // that lastByte isn't beyond the end of the object. long lastByte = Math.min(bytePosition + partSize - 1, objectSize - 1); // Copy this part. CopyPartRequest copyRequest = new CopyPartRequest() .withSourceBucketName(sourceBucketName) .withSourceKey(sourceObjectKey) .withDestinationBucketName(destBucketName) .withDestinationKey(destObjectKey) .withUploadId(initResult.getUploadId()) .withFirstByte(bytePosition) .withLastByte(lastByte) .withPartNumber(partNum++); copyResponses.add(s3Client.copyPart(copyRequest)); bytePosition += partSize; } // Complete the upload request to concatenate all uploaded parts and make the copied object available. CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest( destBucketName, destObjectKey, initResult.getUploadId(), getETags(copyResponses)); s3Client.completeMultipartUpload(completeRequest); System.out.println("Multipart copy complete."); } catch(AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch(SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } // This is a helper function to construct a list of ETags. private 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; } }