Trabajo con S3 y almacenamiento en la nube en Java con AWS SDK
Los almacenes de objetos en la nube mediante el protocolo S3 (Amazon Simple Storage Service) se han convertido en el estándar de facto para almacenar datos no estructurados. En Java, para trabajar con almacenes compatibles con S3 (Amazon S3, MinIO, Yandex Object Storage, DigitalOcean Spaces, etc.) se utiliza la biblioteca oficial AWS SDK for Java. En este artículo analizaremos la conexión, inicialización del cliente y las operaciones principales con archivos.
Conexión de AWS SDK
Para trabajar con S3, agregue la dependencia en 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'Creación del cliente S3
El cliente se configura mediante el builder. Para Amazon S3, basta con especificar la región:
S3Client s3 = S3Client.builder() .region(Region.EU_CENTRAL_1) .build();Para almacenes compatibles (MinIO, Yandex Object Storage) es necesario especificar el endpoint y las credenciales:
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) // la región puede ser cualquiera .credentialsProvider(StaticCredentialsProvider.create( AwsBasicCredentials.create(accessKey, secretKey))) .build();Operaciones principales con buckets
- Creación de bucket
- Verificación de existencia
- Eliminación de bucket
Ejemplo de creación de bucket:
String bucketName = "my-java-bucket";try { s3.createBucket(CreateBucketRequest.builder() .bucket(bucketName) .build()); System.out.println("Bucket creado: " + bucketName);} catch (S3Exception e) { System.err.println("Error: " + e.awsErrorDetails().errorMessage());}Carga de archivos (Upload)
Se puede cargar un archivo desde un flujo, una cadena o un archivo local:
// Carga desde archivo locals3.putObject(PutObjectRequest.builder() .bucket(bucketName) .key("docs/report.pdf") .build(), RequestBody.fromFile(Paths.get("/home/user/report.pdf")));
// Carga de cadena como archivo de textos3.putObject(PutObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .contentType("text/plain") .build(), RequestBody.fromString("Hello, S3!"));Descarga de archivos (Download)
Para obtener un objeto, use getObject:
// Descarga a archivos3.getObject(GetObjectRequest.builder() .bucket(bucketName) .key("docs/report.pdf") .build(), ResponseTransformer.toFile(Paths.get("downloaded_report.pdf")));
// Descarga a cadenaString content = s3.getObjectAsBytes(GetObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .build()) .asUtf8String();System.out.println(content);Eliminación de objetos
s3.deleteObject(DeleteObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .build());System.out.println("Archivo eliminado");Lista de objetos en el bucket
Para obtener la lista de todos los archivos (con paginación):
ListObjectsV2Request listReq = ListObjectsV2Request.builder() .bucket(bucketName) .maxKeys(100) .build();
ListObjectsV2Response listRes = s3.listObjectsV2(listReq);for (S3Object obj : listRes.contents()) { System.out.println(" - " También en la biblioteca
PDFKit para JavaScript (Node.js): guía completa con ejemplos
Criptografía en Go (Golang): cifrado y hashing
ORM para JavaScript (Node.js): comparación de Sequelize, TypeORM, Prisma
Procesamiento de Markdown en Swift para iOS y macOS: bibliotecas y ejemplos