From a8da17162afad16a15df81395a7cf077f91536d4 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 3 Jul 2025 15:26:35 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=BB=A4=EB=AE=A4=EB=8B=88=ED=8B=B0=20?= =?UTF-8?q?=EA=B8=80=20=EB=93=B1=EB=A1=9D/=EC=88=98=EC=A0=95=20-=20?= =?UTF-8?q?=EC=9C=A0=EB=A3=8C=20=EA=B8=80=EC=97=90=EC=84=9C=EB=A7=8C=20gif?= =?UTF-8?q?=EB=A5=BC=20=EB=93=B1=EB=A1=9D=ED=95=A0=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 3 +++ .../CreatorCommunityService.kt | 5 +++++ .../sodalive/utils/ImageValidation.kt | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/utils/ImageValidation.kt diff --git a/build.gradle.kts b/build.gradle.kts index e9cca79..ef92369 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -70,6 +70,9 @@ dependencies { implementation("org.apache.poi:poi-ooxml:5.2.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + // file mimetype check + implementation("org.apache.tika:tika-core:3.2.0") + developmentOnly("org.springframework.boot:spring-boot-devtools") runtimeOnly("com.h2database:h2") runtimeOnly("com.mysql:mysql-connector-j") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/profile/creatorCommunity/CreatorCommunityService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/profile/creatorCommunity/CreatorCommunityService.kt index b8e5415..a8deee9 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/profile/creatorCommunity/CreatorCommunityService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/profile/creatorCommunity/CreatorCommunityService.kt @@ -21,6 +21,7 @@ import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import kr.co.vividnext.sodalive.utils.generateFileName +import kr.co.vividnext.sodalive.utils.validateImage import org.springframework.beans.factory.annotation.Value import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull @@ -71,6 +72,8 @@ class CreatorCommunityService( throw SodaException("오디오 등록을 위해서는 이미지가 필요합니다.") } + postImage?.let { validateImage(it, request.price > 0) } + val post = CreatorCommunity( content = request.content, price = request.price, @@ -129,6 +132,8 @@ class CreatorCommunityService( val post = repository.findByIdAndMemberId(id = request.creatorCommunityId, memberId = member.id!!) ?: throw SodaException("잘못된 요청입니다.") + postImage?.let { validateImage(it, post.price > 0) } + if (request.content != null) { post.content = request.content } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/utils/ImageValidation.kt b/src/main/kotlin/kr/co/vividnext/sodalive/utils/ImageValidation.kt new file mode 100644 index 0000000..2443064 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/utils/ImageValidation.kt @@ -0,0 +1,21 @@ +package kr.co.vividnext.sodalive.utils + +import kr.co.vividnext.sodalive.common.SodaException +import org.apache.tika.Tika +import org.springframework.web.multipart.MultipartFile + +/** + * 이미지 파일인지 확인하고, + * GIF의 경우 외부 조건(gifAllowed)에 따라 허용 여부 판단 + */ +fun validateImage(file: MultipartFile, gifAllowed: Boolean) { + val mimeType = Tika().detect(file.bytes) + + if (!mimeType.startsWith("image/")) { + throw SodaException("이미지 파일만 업로드할 수 있습니다.") + } + + if (mimeType == "image/gif" && !gifAllowed) { + throw SodaException("GIF 파일은 유료 게시물만 업로드 할 수 있습니다.") + } +}