commit 35908fe7c0f5885cf18479933b8096720559c19a Author: Isidoro Nevares Martín Date: Sun May 3 10:17:57 2026 +0200 Acceso S3 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a80efc5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/bin/ +*.class +/target/ +.project +.classpath +.settings/ diff --git a/fichero/subida_archivos_a_s3.jpg b/fichero/subida_archivos_a_s3.jpg new file mode 100644 index 0000000..d28f2e8 Binary files /dev/null and b/fichero/subida_archivos_a_s3.jpg differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d2e4f2a --- /dev/null +++ b/pom.xml @@ -0,0 +1,26 @@ + + 4.0.0 + org.lapaloma.s3 + pfc_acceso_s3 + 0.0.1-SNAPSHOT + + + + + software.amazon.awssdk + s3 + 2.44.0 + compile + + + + + + software.amazon.awssdk + auth + 2.44.0 + compile + + + + \ No newline at end of file diff --git a/src/main/java/org/lapaloma/pfc/AppPrincipal.java b/src/main/java/org/lapaloma/pfc/AppPrincipal.java new file mode 100644 index 0000000..9ee486d --- /dev/null +++ b/src/main/java/org/lapaloma/pfc/AppPrincipal.java @@ -0,0 +1,97 @@ +package org.lapaloma.pfc; + +import java.io.File; +import java.net.URL; +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; + +public class AppPrincipal { + private final static String NOMBRE_BUCKET_EN_S3 = "s3-obj-proyecto1"; + + private static final int TIEMPO_VIDA_MINUTOS_URL = 60; + + public static void main(String[] args) { + // TODO Auto-generated method stub + AppPrincipal app = new AppPrincipal(); + + // Información del bucket y del archivo a subir + int idProyecto = 1; + int numeroHito = 2; + File documentoEjemplo = new File("fichero/subida_archivos_a_s3.jpg"); + String claveDocumento = idProyecto + "/" + numeroHito + "/" + documentoEjemplo.getName(); + + app.almacenarDocumentoEnS3(claveDocumento, documentoEjemplo); + + String url = app.obtenerURLObjetoS3(claveDocumento); + System.out.println("URL del objeto en S3: " + url); + } + + + 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) { + 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"); + + // 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 la solicitud de obtención de objeto + GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(NOMBRE_BUCKET_EN_S3).key(claveDocumento) + .build(); + + // 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 + ); + + // Obtener la URL firmada + URL presignedUrl = presignedRequest.url(); + urlObjetoS3 = presignedUrl.toString(); + + // Cerrar el presigner + presigner.close(); + + return urlObjetoS3; + } + +} diff --git a/src/main/java/org/lapaloma/pfc/gestores/GestorClientesServiciosAWS.java b/src/main/java/org/lapaloma/pfc/gestores/GestorClientesServiciosAWS.java new file mode 100644 index 0000000..32ceeda --- /dev/null +++ b/src/main/java/org/lapaloma/pfc/gestores/GestorClientesServiciosAWS.java @@ -0,0 +1,22 @@ +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; + +public class GestorClientesServiciosAWS { + 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; + + } + +}