diff --git a/build.gradle.kts b/build.gradle.kts index 71e2dec..b2cf9e1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("io.github.kotlin-telegram-bot.kotlin-telegram-bot:telegram:6.3.0") implementation("io.github.oshai:kotlin-logging-jvm:7.0.3") - implementation("io.minio:minio:8.6.0") + implementation(awssdk.services.s3) developmentOnly("org.springframework.boot:spring-boot-devtools") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") testImplementation("org.springframework.boot:spring-boot-starter-test") diff --git a/settings.gradle.kts b/settings.gradle.kts index c413130..9979007 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,4 +4,10 @@ dependencyResolutionManagement { repositories { mavenCentral() } + + versionCatalogs { + create("awssdk") { + from("aws.sdk.kotlin:version-catalog:1.5.97") + } + } } \ No newline at end of file diff --git a/src/main/kotlin/com/pischule/memevizor/upload/FileUploaderService.kt b/src/main/kotlin/com/pischule/memevizor/upload/FileUploaderService.kt index f61ac00..f3eb7ee 100644 --- a/src/main/kotlin/com/pischule/memevizor/upload/FileUploaderService.kt +++ b/src/main/kotlin/com/pischule/memevizor/upload/FileUploaderService.kt @@ -1,9 +1,11 @@ package com.pischule.memevizor.upload +import aws.sdk.kotlin.services.s3.S3Client +import aws.sdk.kotlin.services.s3.model.PutObjectRequest +import aws.smithy.kotlin.runtime.content.ByteStream import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.withLoggingContext -import io.minio.MinioClient -import io.minio.PutObjectArgs +import kotlinx.coroutines.runBlocking import org.springframework.boot.autoconfigure.condition.ConditionalOnBean import org.springframework.stereotype.Service @@ -11,17 +13,18 @@ private val logger = KotlinLogging.logger {} @ConditionalOnBean(S3Config::class) @Service -class FileUploaderService(private val s3Client: MinioClient, private val s3Props: S3Props) { +class FileUploaderService(private val s3Client: S3Client, private val s3Props: S3Props) { fun uploadFile(fileBytes: ByteArray, filename: String, contentType: String) { withLoggingContext("filename" to filename, "bucket" to s3Props.bucket) { - s3Client.putObject( - PutObjectArgs.builder() - .bucket(s3Props.bucket) - .`object`(filename) - .stream(fileBytes.inputStream(), fileBytes.size.toLong(), -1) - .contentType(contentType) - .build() - ) + val request = PutObjectRequest { + bucket = s3Props.bucket + key = filename + body = ByteStream.fromBytes(fileBytes) + this.contentType = contentType + } + + logger.info { "Started uploading a file" } + runBlocking { s3Client.putObject(request) } logger.info { "Uploaded a file to S3" } } } diff --git a/src/main/kotlin/com/pischule/memevizor/upload/S3Config.kt b/src/main/kotlin/com/pischule/memevizor/upload/S3Config.kt index 0b80729..3f7765c 100644 --- a/src/main/kotlin/com/pischule/memevizor/upload/S3Config.kt +++ b/src/main/kotlin/com/pischule/memevizor/upload/S3Config.kt @@ -1,6 +1,8 @@ package com.pischule.memevizor.upload -import io.minio.MinioClient +import aws.sdk.kotlin.runtime.auth.credentials.StaticCredentialsProvider +import aws.sdk.kotlin.services.s3.S3Client +import aws.smithy.kotlin.runtime.net.url.Url import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -8,11 +10,17 @@ import org.springframework.context.annotation.Configuration @EnableConfigurationProperties(S3Props::class) @Configuration class S3Config { + @Bean - fun s3Client(s3Props: S3Props): MinioClient = - MinioClient.builder() - .endpoint(s3Props.endpoint) - .region(s3Props.region) - .credentials(s3Props.accessKeyId, s3Props.secretAccessKey) - .build() + fun s3Client(s3Props: S3Props) = S3Client { + endpointUrl = Url.parse(s3Props.endpoint) + region = s3Props.region + credentialsProvider = StaticCredentialsProvider { + accessKeyId = s3Props.accessKeyId + secretAccessKey = s3Props.secretAccessKey + } + + // not supported by Yandex Object Storage + continueHeaderThresholdBytes = null + } }