Acceso S3

This commit is contained in:
Isidoro Nevares Martín 2026-05-03 10:17:57 +02:00
commit 35908fe7c0
5 changed files with 151 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
/bin/
*.class
/target/
.project
.classpath
.settings/

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

26
pom.xml Normal file
View File

@ -0,0 +1,26 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lapaloma.s3</groupId>
<artifactId>pfc_acceso_s3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- Dependencia para S3 -->
<!-- Source: https://mvnrepository.com/artifact/software.amazon.awssdk/s3 -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.44.0</version>
<scope>compile</scope>
</dependency>
<!-- Dependencia para la autenticación -->
<!-- Source: https://mvnrepository.com/artifact/software.amazon.awssdk/auth -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
<version>2.44.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -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;
}
}

View File

@ -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;
}
}