S3 object read function does not read byte according to the buffer declared.
I want to read a file from a bucket and upload that file into another bucket. But as file can be huge I want to read and upload the file in chunks.
For reading I am using s3Object.read(buffer) and for uploading I am using CompletedMultipartUpload.
package com.dnd.adx.injector;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.core.ResponseInputStream;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
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.CreateMultipartUploadRequest;
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.UploadPartRequest;
public class Test {
public static void main(String[] args) throws IOException {
AwsCredentialsProvider awsCredentialsProvider = DefaultCredentialsProvider.builder().build();
S3Client s3Client = S3Client.builder().region(Region.of(Region.CA_CENTRAL_1.toString()))
.credentialsProvider(awsCredentialsProvider).build();
GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket("dev-dnd-crushftp-client-bucket")
.key("CrushFTP.log_20230223_235929.log").build();
ResponseInputStream<GetObjectResponse> s3Object = s3Client.getObject(getObjectRequest);
byte[] buffer = new byte[5000];
int noOfByteRead = 0;
int counter = 1;
CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder()
.bucket("dev-dnd-crushftp-encrypt-decrypt-file").key("CrushFTP2.log").build();
CreateMultipartUploadResponse response = s3Client.createMultipartUpload(createMultipartUploadRequest);
String uploadId = response.uploadId();
List<CompletedPart> completePartList = new ArrayList<>();
while ((noOfByteRead = s3Object.read(buffer)) != -1) {
byte[] copyBuffer = Arrays.copyOf(buffer, noOfByteRead);
System.out.println(noOfByteRead);
// System.out.println(new String(copyBuffer));
SdkBytes sdkBytes = SdkBytes.fromByteArray(copyBuffer);
CompletedPart part = writeToS3Object(s3Client, counter, sdkBytes, uploadId);
completePartList.add(part);
counter++;
}
CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder().parts(completePartList)
.build();
CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder()
.bucket("dev-dnd-crushftp-encrypt-decrypt-file").key("CrushFTP2.log")
.multipartUpload(completedMultipartUpload).uploadId(uploadId).build();
s3Client.completeMultipartUpload(completeMultipartUploadRequest);
}
public static CompletedPart writeToS3Object(S3Client s3Client, int counter, SdkBytes bufferBytes, String uploadId) {
System.out.println(uploadId);
UploadPartRequest uploadPartRequest = UploadPartRequest.builder()
.bucket("dev-dnd-crushftp-encrypt-decrypt-file").key("CrushFTP2.log").uploadId(uploadId)
.partNumber(counter).build();
String etag = s3Client.uploadPart(uploadPartRequest, RequestBody.fromByteBuffer(bufferBytes.asByteBuffer()))
.eTag();
CompletedPart completedPart = CompletedPart.builder().partNumber(counter).eTag(etag).build();
return completedPart;
}
}
The no of bytes read by the program from s3Object even when I have given buffer of 5 mb :
18:49:25,372 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@dd8ba08 - Registering current configuration as safe fallback point
7585
16384
1024
16384
1024
10992
9000
8408
16384
1024
16384
1024
16384
1024
16384
1024
16384
1024
16384