Trabajo con S3 y almacenamiento en la nube en Kotlin
Los almacenes de objetos en la nube compatibles con el protocolo Amazon S3 (Simple Storage Service) se han convertido en el estándar de facto para almacenar datos no estructurados: imágenes, videos, registros, copias de seguridad y artefactos de compilación. En el ecosistema de Kotlin (JVM, Android, Kotlin Multiplatform), se utilizan dos enfoques principales para interactuar con S3: el oficial AWS SDK for Java/Kotlin y el ligero MinIO Java SDK. En este artículo, analizaremos ambas opciones, mostraremos ejemplos de código y daremos recomendaciones para elegir.
1. AWS SDK for Java (Kotlin)
El SDK oficial de Amazon admite todas las funcionalidades de S3, incluyendo carga multiproceso, gestión del ciclo de vida, versionado y cifrado. Para Kotlin, basta con agregar la dependencia en build.gradle.kts:
dependencies { implementation("software.amazon.awssdk:s3:2.27.0") implementation("software.amazon.awssdk:auth:2.27.0")}Ejemplo básico de carga de un archivo en un bucket de S3:
import software.amazon.awssdk.auth.credentials.AwsBasicCredentialsimport software.amazon.awssdk.auth.credentials.StaticCredentialsProviderimport software.amazon.awssdk.regions.Regionimport software.amazon.awssdk.services.s3.S3Clientimport software.amazon.awssdk.services.s3.model.PutObjectRequestimport java.nio.file.Paths
fun main() { val credentials = AwsBasicCredentials.create("ACCESS_KEY", "SECRET_KEY") val s3 = S3Client.builder() .region(Region.EU_CENTRAL_1) .credentialsProvider(StaticCredentialsProvider.create(credentials)) .build()
val request = PutObjectRequest.builder() .bucket("my-bucket") .key("uploads/photo.jpg") .contentType("image/jpeg") .build()
s3.putObject(request, Paths.get("/local/path/photo.jpg")) println("Archivo cargado")}Descarga de un objeto:
import software.amazon.awssdk.services.s3.model.GetObjectRequest
val getRequest = GetObjectRequest.builder() .bucket("my-bucket") .key("uploads/photo.jpg") .build()
s3.getObject(getRequest, Paths.get("/local/download/photo.jpg"))2. MinIO Java SDK (Almacenamiento compatible con S3)
MinIO es un almacén de objetos de alto rendimiento y código abierto, totalmente compatible con la API de S3. Su SDK es adecuado para trabajar tanto con MinIO local como con AWS S3, DigitalOcean Spaces, Yandex Object Storage y otros proveedores. Agregue la dependencia:
dependencies { implementation("io.minio:minio:8.5.10")}Ejemplo de carga de un archivo a través del SDK de MinIO:
import io.minio.MinioClientimport io.minio.PutObjectArgsimport java.io.FileInputStream
fun main() { val minioClient = MinioClient.builder() .endpoint("https://play.min.io") .credentials("minioadmin", "minioadmin") .build()
val inputStream = FileInputStream("/local/data/report.pdf") minioClient.putObject( PutObjectArgs.builder() .bucket("documents") .`object`("reports/2024/report.pdf") .stream(inputStream, inputStream.available(), -1) .contentType("application/pdf") .build() ) println("Archivo cargado en MinIO")}Descarga a través de MinIO:
import io.minio.GetObjectArgsimport java.io.FileOutputStream
val getArgs = GetObjectArgs.builder() .bucket("documents") .`object`("reports/2024/report.pdf") .build()
val response = minioClient.getObject(getArgs)response.use { stream -> FileOutputStream("/local/download/report.pdf").use { output -> stream.transferTo(output) }}3. Trabajo con enlaces públicos y tiempos de expiración
Generación de un enlace temporal (presigned URL) para descargar sin a
También en la biblioteca
Cliente Redis para Rust: descripción general de la biblioteca redis-rs
Envío de SMS en Go (Golang): integración con API de biblioteca
Generación de PDF en Kotlin: revisión de bibliotecas y herramientas
Trabajo con imágenes en Kotlin: bibliotecas y herramientas