Как прочитать файл из корзины Amazon S3 с помощью пакета SDK AWS для Java Версии 2

#amazon-web-services #amazon-s3

Вопрос:

Я смог прочитать файл с помощью AmazonS3Client, но теперь я пытаюсь прочитать файл с помощью пакета software.amazon.awssdk.services.s3.S3Client. Я не нашел возможности передать имя файла в конструкцию GetObjectRequest, в отличие от пакета com.amazonaws.services.s3. Вот мой пример кода.

 import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;
import software.amazon.awssdk.services.s3.model.S3Object;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;

main(String[] args){
String bucketName = "some-name-s3";
Region region = Region.US_EAST_1;
            S3Client s3client = S3Client
                    .builder()
                    .region(region)
                    .build();
ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucketName).build();
ListObjectsV2Response listObjectsV2 = s3client.listObjectsV2(listObjectsV2Request);
            List<S3Object> s3Objects = listObjectsV2.contents();
}
 

Теперь, как прочитать каждый файл и обработать поток из s3Objects.

Ответ №1:

Вы используете неправильную логику для чтения объекта из корзины Amazon S3 с помощью AWS SDK для Java V2. Вы вызываете списки ведер. Вы можете получить метаданные о каждом объекте, вызывающем listObjectsV2. Например, вы можете вызвать метод S3Object key (), чтобы получить имя ключа.

Теперь, чтобы прочитать объект из корзины Amazon S3, вам нужно имя корзины и имя ключа, а затем вызвать getObjectAsBytes, как показано в этой логике Java, которая показывает, как прочитать PDF-документ и записать его в локальный путь:

 package com.example.s3;

import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
    
/**
 * To run this AWS code example, ensure that you have setup your development environment, including your AWS credentials.
 *
 * For information, see this documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */

public class GetObjectData {

    public static void main(String[] args) {

     final String USAGE = "n"  
                "Usage:n"  
                "    GetObjectData <bucketName> <keyName> <path>nn"  
                "Where:n"  
                "    bucketName - the Amazon S3 bucket name. nn" 
                "    keyName - the key name. nn" 
                "    path - the path where the file is written to. nn";

        if (args.length != 3) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String bucketName = "myBucket";
        String keyName = "book.pdf";
        String path = "C:/AWS/book.pdf";

        Region region = Region.US_EAST_1;
        S3Client s3 = S3Client.builder()
                .region(region)
                .build();

        getObjectBytes(s3,bucketName,keyName, path);
        s3.close();
    }

    
    public static void getObjectBytes (S3Client s3, String bucketName, String keyName, String path ) {

        try {
            GetObjectRequest objectRequest = GetObjectRequest
                    .builder()
                    .key(keyName)
                    .bucket(bucketName)
                    .build();

            ResponseBytes<GetObjectResponse> objectBytes = s3.getObjectAsBytes(objectRequest);
            byte[] data = objectBytes.asByteArray();

            // Write the data to a local file
            File myFile = new File(path );
            OutputStream os = new FileOutputStream(myFile);
            os.write(data);
            System.out.println("Successfully obtained bytes from an S3 object");
            os.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (S3Exception e) {
          System.err.println(e.awsErrorDetails().errorMessage());
           System.exit(1);
        }
    }
} 
 

Найдите этот пример и многие другие примеры кода Amazon S3 Java V2 в Github здесь:

https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/example_code/s3

Комментарии:

1. Спасибо @smac200, попробую этот подход.