@@ -34,8 +34,8 @@ class S3MailFileStorage(
3434 bytes : ByteArray ,
3535 contentType : String ,
3636 ): String {
37+ val resolvedKey = resolveKey(key)
3738 return try {
38- val resolvedKey = resolveKey(key)
3939 val request =
4040 PutObjectRequest .builder()
4141 .bucket(properties.bucket)
@@ -46,13 +46,16 @@ class S3MailFileStorage(
4646
4747 resolvedKey
4848 } catch (e: Exception ) {
49- throw IllegalStateException (" S3 파일 업로드에 실패했습니다: $key " , e)
49+ throw IllegalStateException (
50+ " S3 파일 업로드에 실패했습니다. bucket=${properties.bucket} , key=$key , resolvedKey=$resolvedKey " ,
51+ e,
52+ )
5053 }
5154 }
5255
5356 override fun download (key : String ): ByteArray {
57+ val resolvedKey = resolveKey(key)
5458 return try {
55- val resolvedKey = resolveKey(key)
5659 val request =
5760 GetObjectRequest .builder()
5861 .bucket(properties.bucket)
@@ -61,7 +64,10 @@ class S3MailFileStorage(
6164
6265 client.getObjectAsBytes(request).asByteArray()
6366 } catch (e: Exception ) {
64- throw IllegalStateException (" S3 파일 다운로드에 실패했습니다: $key " , e)
67+ throw IllegalStateException (
68+ " S3 파일 다운로드에 실패했습니다. bucket=${properties.bucket} , key=$key , resolvedKey=$resolvedKey " ,
69+ e,
70+ )
6571 }
6672 }
6773
@@ -70,8 +76,8 @@ class S3MailFileStorage(
7076 contentType : String ,
7177 expireDuration : Duration ,
7278 ): String {
79+ val resolvedKey = resolveKey(key)
7380 return try {
74- val resolvedKey = resolveKey(key)
7581 val putObjectRequest =
7682 PutObjectRequest .builder()
7783 .bucket(properties.bucket)
@@ -86,7 +92,10 @@ class S3MailFileStorage(
8692
8793 presigner.presignPutObject(presignRequest).url().toString()
8894 } catch (e: Exception ) {
89- throw IllegalStateException (" S3 업로드용 presigned URL 생성에 실패했습니다: $key " , e)
95+ throw IllegalStateException (
96+ " S3 업로드용 presigned URL 생성에 실패했습니다. bucket=${properties.bucket} , key=$key , resolvedKey=$resolvedKey " ,
97+ e,
98+ )
9099 }
91100 }
92101
@@ -96,11 +105,17 @@ class S3MailFileStorage(
96105 }
97106
98107 private fun resolveKey (key : String ): String {
108+ val normalizedKey = key.trim().removePrefix(" /" )
99109 if (properties.keyPrefix.isBlank()) {
100- return key
110+ return normalizedKey
111+ }
112+
113+ val normalizedPrefix = properties.keyPrefix.trim().trim(' /' )
114+ if (normalizedKey == normalizedPrefix || normalizedKey.startsWith(" $normalizedPrefix /" )) {
115+ return normalizedKey
101116 }
102117
103- return " ${properties.keyPrefix.trimEnd( ' / ' )} / $key "
118+ return " $normalizedPrefix / $normalizedKey "
104119 }
105120
106121 @PreDestroy
0 commit comments