Arbeit mit S3 und Cloud-Speichern in Kotlin
Cloud-Objektspeicher, die mit dem Amazon S3-Protokoll (Simple Storage Service) kompatibel sind, sind zum De-facto-Standard für die Speicherung unstrukturierter Daten geworden: Bilder, Videos, Logs, Backups und Build-Artefakte. Im Kotlin-Ökosystem (JVM, Android, Kotlin Multiplatform) werden für die Interaktion mit S3 zwei Hauptansätze verwendet: das offizielle AWS SDK for Java/Kotlin und das leichte MinIO Java SDK. In diesem Artikel werden wir beide Optionen analysieren, Codebeispiele zeigen und Empfehlungen zur Auswahl geben.
1. AWS SDK for Java (Kotlin)
Das offizielle SDK von Amazon unterstützt alle S3-Funktionen, einschließlich Multithread-Upload, Lebenszyklusverwaltung, Versionierung und Verschlüsselung. Für Kotlin reicht es aus, die Abhängigkeit in build.gradle.kts hinzuzufügen:
dependencies { implementation("software.amazon.awssdk:s3:2.27.0") implementation("software.amazon.awssdk:auth:2.27.0")}Basisbeispiel für das Hochladen einer Datei in einen S3-Bucket:
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("Datei hochgeladen")}Herunterladen eines Objekts:
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 (S3-kompatibler Speicher)
MinIO ist ein leistungsstarker Open-Source-Objektspeicher, der vollständig mit der S3-API kompatibel ist. Sein SDK eignet sich für die Arbeit sowohl mit lokalem MinIO als auch mit AWS S3, DigitalOcean Spaces, Yandex Object Storage und anderen Anbietern. Fügen Sie die Abhängigkeit hinzu:
dependencies { implementation("io.minio:minio:8.5.10")}Beispiel für das Hochladen einer Datei mit dem 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("Datei in MinIO hochgeladen")}Herunterladen mit 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. Arbeiten mit öffentlichen Links und Gültigkeitsdauern
Generierung einer temporären URL (presigned URL) zum Herunterladen ohne A
Auch in der Bibliothek
Arbeiten mit Excel in Go (Golang): Bibliotheken Excelize, xlsx, tealeg
Markdown-Verarbeitung in C# (.NET): Bibliotheken und Werkzeuge
Rust Standardbibliothek: vollständiger Überblick
Dependency Injection Container für JavaScript (Node.js) — Awilix