0

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
  • 3
    You want to [copy an object from one bucket to another](https://stackoverflow.com/questions/56670285/aws-java-sdk-2-s3-copy-object)? – jarmod May 23 '23 at 20:53

0 Answers0