Arbeit mit S3 und Cloud-Speichern in Kotlin
\n\nIn 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\n1. AWS SDK für Kotlin (aws-sdk-kotlin)
\n\nDas 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\nAbhängigkeit hinzufügen
\nFügen Sie in build.gradle.kts hinzu:
dependencies {\n implementation("aws.sdk.kotlin:s3:1.0.0")\n implementation("aws.smithy.kotlin:http-client-engine-ktor:1.0.0")\n}\n\nClient initialisieren
\nimport 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\nDatei hochladen (PutObject)
\nsuspend 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\nDatei herunterladen (GetObject)
\nsuspend 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\nObjekte im Bucket auflisten
\nsuspend 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\n2. Ktor S3 Client (leichtgewichtige Alternative)
\n\nWenn 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\nAbhängigkeit hinzufügen
\ndependencies {\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\nS3-Client mit Ktor erstellen
\nimport 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(" Auch in der Bibliothek
Helmet für JavaScript (Node.js): Vollständige Anleitung mit Beispielen
SMS-Versand per API auf Node.js: Bibliothek twilio
Serilog für C# (.NET): Vollständige Anleitung mit Beispielen
Generierung von PDF-Berichten in PHP: Bibliotheksübersicht und Codebeispiele