Travailler avec S3 et les stockages cloud en Kotlin
Les stockages d'objets cloud compatibles avec le protocole Amazon S3 (Simple Storage Service) sont devenus la norme de facto pour le stockage de données non structurées : images, vidéos, journaux, sauvegardes et artefacts de build. Dans l'écosystème Kotlin (JVM, Android, Kotlin Multiplatform), deux approches principales sont utilisées pour interagir avec S3 : le SDK officiel AWS SDK for Java/Kotlin et le SDK léger MinIO Java SDK. Dans cet article, nous examinerons les deux options, montrerons des exemples de code et donnerons des recommandations pour le choix.
1. AWS SDK for Java (Kotlin)
Le SDK officiel d'Amazon prend en charge toutes les fonctionnalités de S3, y compris le téléchargement multithread, la gestion du cycle de vie, le versioning et le chiffrement. Pour Kotlin, il suffit d'ajouter la dépendance dans build.gradle.kts :
dependencies { implementation("software.amazon.awssdk:s3:2.27.0") implementation("software.amazon.awssdk:auth:2.27.0")}Exemple de base de téléchargement d'un fichier dans un 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("Fichier téléchargé")}Téléchargement d'un objet :
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 (stockage compatible S3)
MinIO est un stockage d'objets hautes performances open source, entièrement compatible avec l'API S3. Son SDK convient pour travailler à la fois avec MinIO local et avec AWS S3, DigitalOcean Spaces, Yandex Object Storage et d'autres fournisseurs. Ajoutez la dépendance :
dependencies { implementation("io.minio:minio:8.5.10")}Exemple de téléchargement d'un fichier via le SDK 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("Fichier téléchargé dans MinIO")}Téléchargement 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. Travailler avec les liens publics et les délais d'expiration
Génération d'un lien temporaire (presigned URL) pour le téléchargement sans a