#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, попробую этот подход.