Trabalho com S3 e armazenamentos em nuvem em Java usando AWS SDK
Os armazenamentos de objetos em nuvem pelo protocolo S3 (Amazon Simple Storage Service) tornaram-se o padrão de facto para armazenar dados não estruturados. Em Java, para trabalhar com armazenamentos compatíveis com S3 (Amazon S3, MinIO, Yandex Object Storage, DigitalOcean Spaces, etc.), utiliza-se a biblioteca oficial AWS SDK for Java. Neste artigo, abordaremos a conexão, inicialização do cliente e as principais operações com arquivos.
Conexão do AWS SDK
Para trabalhar com S3, adicione a dependência no pom.xml (Maven):
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.27.0</version></dependency>Para Gradle:
implementation 'software.amazon.awssdk:s3:2.27.0'Criação do cliente S3
O cliente é configurado através do builder. Para Amazon S3, basta especificar a região:
S3Client s3 = S3Client.builder() .region(Region.EU_CENTRAL_1) .build();Para armazenamentos compatíveis (MinIO, Yandex Object Storage), é necessário especificar o endpoint e as credentials:
String endpoint = "https://storage.yandexcloud.net";String accessKey = "YOUR_ACCESS_KEY";String secretKey = "YOUR_SECRET_KEY";
S3Client s3 = S3Client.builder() .endpointOverride(URI.create(endpoint)) .region(Region.US_EAST_1) // a região pode ser qualquer uma .credentialsProvider(StaticCredentialsProvider.create( AwsBasicCredentials.create(accessKey, secretKey))) .build();Operações principais com buckets
- Criação de bucket
- Verificação de existência
- Exclusão de bucket
Exemplo de criação de bucket:
String bucketName = "my-java-bucket";try { s3.createBucket(CreateBucketRequest.builder() .bucket(bucketName) .build()); System.out.println("Bucket criado: " + bucketName);} catch (S3Exception e) { System.err.println("Erro: " + e.awsErrorDetails().errorMessage());}Upload de arquivos (Upload)
É possível fazer upload de um arquivo a partir de um stream, string ou arquivo local:
// Upload a partir de arquivo locals3.putObject(PutObjectRequest.builder() .bucket(bucketName) .key("docs/report.pdf") .build(), RequestBody.fromFile(Paths.get("/home/user/report.pdf")));
// Upload de string como arquivo de textos3.putObject(PutObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .contentType("text/plain") .build(), RequestBody.fromString("Hello, S3!"));Download de arquivos (Download)
Para obter um objeto, use getObject:
// Download para arquivos3.getObject(GetObjectRequest.builder() .bucket(bucketName) .key("docs/report.pdf") .build(), ResponseTransformer.toFile(Paths.get("downloaded_report.pdf")));
// Download para stringString content = s3.getObjectAsBytes(GetObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .build()) .asUtf8String();System.out.println(content);Exclusão de objetos
s3.deleteObject(DeleteObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .build());System.out.println("Arquivo excluído");Lista de objetos no bucket
Para obter a lista de todos os arquivos (com paginação):
ListObjectsV2Request listReq = ListObjectsV2Request.builder() .bucket(bucketName) .maxKeys(100) .build();
ListObjectsV2Response listRes = s3.listObjectsV2(listReq);for (S3Object obj : listRes.contents()) { System.out.println(" - "