Trabalhando com S3 e armazenamentos em nuvem em Kotlin: AWS SDK e MinIO

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com S3 e armazenamentos em nuvem em Kotlin



Os armazenamentos de objetos em nuvem compatíveis com o protocolo Amazon S3 (Simple Storage Service) tornaram-se o padrão de facto para armazenar dados não estruturados: imagens, vídeos, logs, backups e artefatos de compilação. No ecossistema Kotlin (JVM, Android, Kotlin Multiplatform), duas abordagens principais são usadas para interagir com o S3: o oficial AWS SDK for Java/Kotlin e o leve MinIO Java SDK. Neste artigo, analisaremos ambas as opções, mostraremos exemplos de código e daremos recomendações de escolha.



1. AWS SDK for Java (Kotlin)



O SDK oficial da Amazon suporta todos os recursos do S3, incluindo upload multithread, gerenciamento de ciclo de vida, versionamento e criptografia. Para Kotlin, basta adicionar a dependência no build.gradle.kts:



dependencies {    implementation("software.amazon.awssdk:s3:2.27.0")    implementation("software.amazon.awssdk:auth:2.27.0")}


Exemplo básico de upload de arquivo para um bucket 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("Arquivo enviado")}


Download do 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 (Armazenamento compatível com S3)



MinIO é um armazenamento de objetos de alto desempenho e código aberto, totalmente compatível com a API S3. Seu SDK é adequado para trabalhar tanto com MinIO local quanto com AWS S3, DigitalOcean Spaces, Yandex Object Storage e outros provedores. Adicione a dependência:



dependencies {    implementation("io.minio:minio:8.5.10")}


Exemplo de upload de arquivo via MinIO SDK:



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("Arquivo enviado para MinIO")}


Download via 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. Trabalhando com links públicos e prazos de validade



Geração de link temporário (presigned URL) para download sem a

Recommendations