java
[Aws SDK] CreateMultipartUploadRequest
컴퓨터로못하는건없어
2021. 4. 13. 23:43
AWS SDK for Java - 2.xx 사용한 방법입니다.
- 분할 업로드 방식
- S3는 단일 개체에 대해 최대 5GB 까지만 업로드가 가능합니다.
- MultipartUpload를 통해 하나의 파일을 여러 조각으로 나누어 전송이 가능합니다.
- 100MB 이상의 파일부터 권장합니다.
- ComplatedPart를 Collection으로 관리하여 5TB까지 part를 저장하여 전송할 수 있도록 합니다.
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;
import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;
import software.amazon.awssdk.services.s3.model.CompletedPart;
import software.amazon.awssdk.services.s3.model.CopyObjectRequest;
import software.amazon.awssdk.services.s3.model.CopyObjectResponse;
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;
import software.amazon.awssdk.services.s3.model.UploadPartRequest;
private void multipartS3Upload(File file, String key) {
//대용량 파일 업로드
try {
CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder()
.bucket(bucket).key(key).build();
CreateMultipartUploadResponse response = amazonS3
.createMultipartUpload(createMultipartUploadRequest);
String uploadId = response.uploadId();
int mB = 1024 * 1024 * 100;
long parts = (file.length() / (long)mB)+1;
List<CompletedPart> completedParts = new ArrayList<CompletedPart>();
for(Integer i=1; i<parts+1; i++) { // Part number must be an integer between 1 and 10000
UploadPartRequest uploadPartRequest = UploadPartRequest.builder().bucket(bucket).key(key)
.uploadId(uploadId).partNumber(i).build();
String etag = amazonS3
.uploadPart(uploadPartRequest, RequestBody.fromBytes(readAccessFileOffset(file, (long)(i-1)*mB, (long)mB)))
.eTag();
completedParts.add(CompletedPart.builder().partNumber(i).eTag(etag).build());
log.info("[S3Client] Completed Upload File, "+key+" # Part Number : "+i);
}
// Finally call completeMultipartUpload operation to tell S3 to merge all uploaded
// parts and finish the multipart operation.
CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder()
.parts(completedParts).build();
CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest
.builder().bucket(bucket).key(key).uploadId(uploadId)
.multipartUpload(completedMultipartUpload).build();
amazonS3.completeMultipartUpload(completeMultipartUploadRequest);
log.info("[S3Client] Completed Upload File " + key);
}catch(Exception e) {
log.error(e.getMessage());
}
}
참고
docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/examples-s3-objects.html
Work with Amazon S3 objects - AWS SDK for Java
These code snippets assume that you understand the material in basics, and have configured default AWS credentials using the information in setup-credentials.
docs.aws.amazon.com