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
Também na biblioteca
Serialização de objetos em TypeScript: bibliotecas, métodos e exemplos
Tokens JWT em PHP: Guia Completo para Autenticação e Autorização
Trabalho com ZIP/arquivos em C++: bibliotecas libzip e zlib