From 9f1c623f7df7dadbc6717fc64edbc8707c4aea65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isidoro=20Nevares=20Mart=C3=ADn?= Date: Sun, 3 May 2026 10:57:06 +0200 Subject: [PATCH] Acceso S3 --- .../java/org/lapaloma/pfc/AppPrincipal.java | 86 ++++++++----------- .../gestores/GestorClientesServiciosAWS.java | 20 +++-- 2 files changed, 51 insertions(+), 55 deletions(-) diff --git a/src/main/java/org/lapaloma/pfc/AppPrincipal.java b/src/main/java/org/lapaloma/pfc/AppPrincipal.java index 9ee486d..cca41a1 100644 --- a/src/main/java/org/lapaloma/pfc/AppPrincipal.java +++ b/src/main/java/org/lapaloma/pfc/AppPrincipal.java @@ -6,19 +6,16 @@ import java.time.Duration; import org.lapaloma.pfc.gestores.GestorClientesServiciosAWS; -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; -import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; -import software.amazon.awssdk.services.s3.model.PutObjectResponse; -import software.amazon.awssdk.services.s3.model.S3Exception; import software.amazon.awssdk.services.s3.presigner.S3Presigner; import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; +import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest; public class AppPrincipal { private final static String NOMBRE_BUCKET_EN_S3 = "s3-obj-proyecto1"; - private static final int TIEMPO_VIDA_MINUTOS_URL = 60; + private static final int TIEMPO_VIDA_MINUTOS_URL = 10; public static void main(String[] args) { // TODO Auto-generated method stub @@ -30,58 +27,51 @@ public class AppPrincipal { File documentoEjemplo = new File("fichero/subida_archivos_a_s3.jpg"); String claveDocumento = idProyecto + "/" + numeroHito + "/" + documentoEjemplo.getName(); - app.almacenarDocumentoEnS3(claveDocumento, documentoEjemplo); + String urlDocumentoAlmacenado = app.almacenarDocumentoEnS3(claveDocumento, documentoEjemplo); + System.out.println("URL del objeto en S3 para hacer un 'PUT': " + urlDocumentoAlmacenado); - String url = app.obtenerURLObjetoS3(claveDocumento); - System.out.println("URL del objeto en S3: " + url); + String urlDocumentoConsultado = app.consultarDocumentoEnS3(claveDocumento); + System.out.println("URL del objeto en S3 para hacer un 'GET': " + urlDocumentoConsultado); } - - private void almacenarDocumentoEnS3(String clave, File documento) { - - // Crear el cliente de S3 (usando SDK v2) - S3Client clienteS3 = GestorClientesServiciosAWS.getClienteBucketS3(); - - - // Solicitud para subir el archivo - PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(NOMBRE_BUCKET_EN_S3).key(clave) - .build(); - - try { - // Realizar la carga del archivo - PutObjectResponse response = clienteS3.putObject(putObjectRequest, documento.toPath()); - - // Imprimir respuesta de éxito - System.out.println("Archivo subido correctamente. ETag: " + response.eTag()); - } catch (S3Exception e) { - System.err.println("No se pudo insertar el ítem: " + e.getMessage()); - e.printStackTrace(); - } finally { - clienteS3.close(); - } - - } - - private String obtenerURLObjetoS3(String claveDocumento) { + private String almacenarDocumentoEnS3(String clave, File documento) { String urlObjetoS3 = null; - // Crear el cliente de S3 (usando SDK v2) - //S3Client clienteS3 = GestorClientesServiciosAWS.getClienteBucketS3(); - // Usar el perfil `learnerlab-profile` (el nombre del perfil en `~/.aws/credentials`) - ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create("default"); + // Solicitud para subir el archivo (método PUT) + PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(NOMBRE_BUCKET_EN_S3).key(clave).build(); - // Crear el cliente presigner de S3 con el perfil específico - S3Presigner presigner = S3Presigner.builder().region(GestorClientesServiciosAWS.REGION_AWS) - .credentialsProvider(credentialsProvider) // Usar el perfil especificado - .build(); + // Crear el cliente presigner de S3 + S3Presigner presigner = GestorClientesServiciosAWS.getClientePrefirmadorBucketS3(); - // Crear la solicitud de obtención de objeto + // Generar la URL firmada + PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder() + .signatureDuration(Duration.ofMinutes(TIEMPO_VIDA_MINUTOS_URL)) // Tiempo expiración URL firmada + .putObjectRequest(putObjectRequest) + .build(); + + // Obtener la URL firmada + URL presignedUrl = presigner.presignPutObject(presignRequest).url(); + urlObjetoS3 = presignedUrl.toString(); + + // Cerrar el presigner + presigner.close(); + + return urlObjetoS3; + } + + private String consultarDocumentoEnS3(String claveDocumento) { + String urlObjetoS3 = null; + + // Crear la solicitud de obtención de objeto (método GET) GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(NOMBRE_BUCKET_EN_S3).key(claveDocumento) .build(); + // Crear el cliente presigner de S3 + S3Presigner presigner = GestorClientesServiciosAWS.getClientePrefirmadorBucketS3(); + // Generar la URL firmada - PresignedGetObjectRequest presignedRequest = presigner.presignGetObject( - builder -> builder.getObjectRequest(getObjectRequest).signatureDuration(Duration.ofMinutes(TIEMPO_VIDA_MINUTOS_URL)) // Duración de la URL firmada + PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(builder -> builder + .getObjectRequest(getObjectRequest).signatureDuration(Duration.ofMinutes(TIEMPO_VIDA_MINUTOS_URL)) // Tiempo expiración URL firmada ); // Obtener la URL firmada @@ -90,8 +80,8 @@ public class AppPrincipal { // Cerrar el presigner presigner.close(); - - return urlObjetoS3; + + return urlObjetoS3; } } diff --git a/src/main/java/org/lapaloma/pfc/gestores/GestorClientesServiciosAWS.java b/src/main/java/org/lapaloma/pfc/gestores/GestorClientesServiciosAWS.java index 32ceeda..cb6d5af 100644 --- a/src/main/java/org/lapaloma/pfc/gestores/GestorClientesServiciosAWS.java +++ b/src/main/java/org/lapaloma/pfc/gestores/GestorClientesServiciosAWS.java @@ -2,21 +2,27 @@ package org.lapaloma.pfc.gestores; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; public class GestorClientesServiciosAWS { - public final static Region REGION_AWS = Region.US_EAST_1; + private static final String PERFIL_CREDENCIALES_AWS = "default"; + public final static Region REGION_AWS = Region.US_EAST_1; // Evita que pueda construirse un objeto de la clase. private GestorClientesServiciosAWS() { } - public static S3Client getClienteBucketS3() { - S3Client clienteS3 = S3Client.builder() - .credentialsProvider(ProfileCredentialsProvider.create()) - .region(REGION_AWS).build(); - return clienteS3; + public static S3Presigner getClientePrefirmadorBucketS3() { + + // Usar el perfil `learnerlab-profile` (el nombre del perfil en `~/.aws/credentials`) + ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(PERFIL_CREDENCIALES_AWS); + // Crear el cliente presigner de S3 con el perfil específico + S3Presigner presigner = S3Presigner.builder().region(GestorClientesServiciosAWS.REGION_AWS) + .credentialsProvider(credentialsProvider) // Usar el perfil especificado + .build(); + + return presigner; } }