Arbeit mit S3 und Cloud-Speichern in Kotlin: AWS SDK und Ktor S3 Client

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeit mit S3 und Cloud-Speichern in Kotlin

\n\n

In der modernen Kotlin-Entwicklung besteht häufig die Notwendigkeit der Integration mit Cloud-Speichern, die mit dem Amazon S3-Protokoll (Simple Storage Service) kompatibel sind. Dies können AWS S3, MinIO, DigitalOcean Spaces, Yandex Object Storage und andere sein. In diesem Artikel betrachten wir zwei Hauptansätze: die Verwendung des offiziellen AWS SDK für Kotlin und eines leichtgewichtigen Clients auf Basis von Ktor.

\n\n

1. AWS SDK für Kotlin (aws-sdk-kotlin)

\n\n

Das offizielle SDK von Amazon bietet eine typisierte und asynchrone API, die Kotlin-Koroutinen vollständig unterstützt. Dies ist die umfassendste Lösung für die Arbeit mit S3.

\n\n

Abhängigkeit hinzufügen

\n

Fügen Sie in build.gradle.kts hinzu:

\n
dependencies {\n    implementation("aws.sdk.kotlin:s3:1.0.0")\n    implementation("aws.smithy.kotlin:http-client-engine-ktor:1.0.0")\n}
\n\n

Client initialisieren

\n
import aws.sdk.kotlin.services.s3.S3Client\nimport aws.sdk.kotlin.services.s3.model.*\n\nsuspend fun createClient(): S3Client = S3Client.fromEnvironment {\n    region = "ru-central1"\n    // Für MinIO oder andere S3-kompatible Speicher:\n    endpointUrl = "https://storage.yandexcloud.net"\n    // Konfiguration über Umgebungsvariablen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY\n}
\n\n

Datei hochladen (PutObject)

\n
suspend fun uploadFile(client: S3Client, bucket: String, key: String, filePath: String) {\n    val fileBytes = java.io.File(filePath).readBytes()\n    client.putObject(\n        PutObjectRequest {\n            this.bucket = bucket\n            this.key = key\n            this.body = fileBytes.toByteArray()\n        }\n    )\n    println("Datei $key in Bucket $bucket hochgeladen")\n}
\n\n

Datei herunterladen (GetObject)

\n
suspend fun downloadFile(client: S3Client, bucket: String, key: String, savePath: String) {\n    val response = client.getObject(\n        GetObjectRequest {\n            this.bucket = bucket\n            this.key = key\n        }\n    )\n    val bytes = response.body?.readAll()\n    if (bytes != null) {\n        java.io.File(savePath).writeBytes(bytes)\n        println("Datei $key in $savePath gespeichert")\n    }\n}
\n\n

Objekte im Bucket auflisten

\n
suspend fun listObjects(client: S3Client, bucket: String): List<String> {\n    val response = client.listObjectsV2(\n        ListObjectsV2Request {\n            this.bucket = bucket\n        }\n    )\n    return response.contents?.map { it.key ?: "" } ?: emptyList()\n}
\n\n

2. Ktor S3 Client (leichtgewichtige Alternative)

\n\n

Wenn Sie nicht die volle Leistungsfähigkeit des AWS SDK benötigen, können Sie Ktor zusammen mit der Bibliothek ktor-client-s3 verwenden. Dies bietet ein minimales Gewicht und volle Kontrolle über HTTP-Anfragen.

\n\n

Abhängigkeit hinzufügen

\n
dependencies {\n    implementation("io.ktor:ktor-client-core:2.3.0")\n    implementation("io.ktor:ktor-client-cio:2.3.0")\n    implementation("io.ktor:ktor-client-content-negotiation:2.3.0")\n    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")\n    // Für die Signierung von S3-Anfragen\n    implementation("io.ktor:ktor-client-auth:2.3.0")\n}
\n\n

S3-Client mit Ktor erstellen

\n
import io.ktor.client.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\nimport io.ktor.http.*\nimport io.ktor.utils.io.*\n\nclass S3KtorClient(\n    private val endpoint: String,\n    private val accessKey: String,\n    private val secretKey: String\n) {\n    private val client = HttpClient {\n        install(io.ktor.client.plugins.auth.Auth) {\n            basic {\n                credentials {\n                    username = accessKey\n                    password = secretKey\n                }\n            }\n        }\n    }\n\n    suspend fun putObject(bucket: String, key: String, data: ByteArray) {\n        client.put("                    

Empfehlungen