Migrate from minio to aws s3 sdk

This commit is contained in:
2025-12-07 17:55:06 +03:00
parent 23dcd998bc
commit 1266b0f440
4 changed files with 36 additions and 19 deletions

View File

@@ -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")

View File

@@ -4,4 +4,10 @@ dependencyResolutionManagement {
repositories {
mavenCentral()
}
versionCatalogs {
create("awssdk") {
from("aws.sdk.kotlin:version-catalog:1.5.97")
}
}
}

View File

@@ -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" }
}
}

View File

@@ -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
}
}