Skip to content

Commit e67a355

Browse files
committed
added correct method to support putObject via inputStream
1 parent dc5a432 commit e67a355

File tree

7 files changed

+62
-12
lines changed

7 files changed

+62
-12
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ repositories {
1010
}
1111

1212
// Append dependency
13-
implementation("com.icerockdev:storage-service:0.7.0")
13+
implementation("com.icerockdev:storage-service:0.8.0")
1414
````
1515

1616
## Library usage

storage-service/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ apply(plugin = "java")
1515
apply(plugin = "kotlin")
1616

1717
group = "com.icerockdev"
18-
version = "0.7.0"
18+
version = "0.8.0"
1919

2020
val sourcesJar by tasks.registering(Jar::class) {
2121
archiveClassifier.set("sources")

storage-service/src/main/kotlin/com/icerockdev/service/storage/preview/PreviewService.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
package com.icerockdev.service.storage.preview
66

77
import com.icerockdev.service.storage.s3.IS3Storage
8+
import com.icerockdev.service.storage.s3.dto.FileObjectDto
89
import kotlinx.coroutines.Dispatchers
910
import kotlinx.coroutines.flow.asFlow
1011
import kotlinx.coroutines.flow.buffer
1112
import kotlinx.coroutines.flow.catch
12-
import kotlinx.coroutines.flow.collect
1313
import kotlinx.coroutines.flow.flowOn
1414
import kotlinx.coroutines.withContext
1515
import org.slf4j.LoggerFactory
@@ -69,7 +69,11 @@ class PreviewService(
6969
val preview = it.imageProcessor(it, imageBytes)
7070
val dstKey = getPreviewName(srcKey, it)
7171

72-
storage.put(dstBucket, dstKey, preview)
72+
storage.put(
73+
dstBucket,
74+
dstKey,
75+
FileObjectDto(preview.inputStream().buffered(), preview.size.toLong())
76+
)
7377
}
7478
} catch (e: PreviewException){
7579
logger.error(e.localizedMessage, e)

storage-service/src/main/kotlin/com/icerockdev/service/storage/s3/IS3Storage.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
package com.icerockdev.service.storage.s3
66

7+
import com.icerockdev.service.storage.s3.dto.FileObjectDto
78
import com.icerockdev.service.storage.s3.policy.builder.PolicyBuilder
89
import com.icerockdev.service.storage.s3.policy.builder.PrincipalBuilder
910
import com.icerockdev.service.storage.s3.policy.builder.ResourceBuilder
1011
import com.icerockdev.service.storage.s3.policy.builder.StatementBuilder
1112
import com.icerockdev.service.storage.s3.policy.dto.Principal
12-
import com.icerockdev.service.storage.s3.policy.dto.Resource
1313
import com.icerockdev.service.storage.s3.policy.dto.Statement
1414
import software.amazon.awssdk.core.ResponseInputStream
1515
import software.amazon.awssdk.services.s3.S3Configuration
@@ -44,8 +44,11 @@ interface IS3Storage {
4444

4545
fun put(bucket: String, key: String, stream: InputStream, metadata: Map<String, String>? = null): Boolean
4646

47+
@Deprecated("Pointless method that simply wraps byteArray")
4748
fun put(bucket: String, key: String, byteArray: ByteArray, metadata: Map<String, String>? = null): Boolean
4849

50+
fun put(bucket: String, key: String, file: FileObjectDto, metadata: Map<String, String>? = null): Boolean
51+
4952
fun copy(srcBucket: String, srcKey: String, dstBucket: String, dstKey: String): Boolean
5053

5154
/**
@@ -59,7 +62,11 @@ interface IS3Storage {
5962

6063
fun getBucketPolicy(bucket: String): String?
6164

62-
fun putBucketPolicy(bucket: String, confirmRemoveSelfBucketAccess: Boolean = false, configure: PolicyBuilder.() -> Unit): Boolean
65+
fun putBucketPolicy(
66+
bucket: String,
67+
confirmRemoveSelfBucketAccess: Boolean = false,
68+
configure: PolicyBuilder.() -> Unit
69+
): Boolean
6370

6471
fun deleteBucketPolicy(bucket: String): Boolean
6572

storage-service/src/main/kotlin/com/icerockdev/service/storage/s3/S3StorageImpl.kt

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package com.icerockdev.service.storage.s3
66

77
import com.icerockdev.service.storage.mime.MimeTypeDetector
8+
import com.icerockdev.service.storage.s3.dto.FileObjectDto
89
import com.icerockdev.service.storage.s3.policy.builder.PolicyBuilder
910
import com.icerockdev.service.storage.s3.policy.builder.PrincipalBuilder
1011
import com.icerockdev.service.storage.s3.policy.builder.ResourceBuilder
@@ -58,6 +59,7 @@ class S3StorageImpl(private val client: S3Client, private val preSigner: S3Presi
5859
.build()
5960
)
6061
} catch (e: NoSuchKeyException) {
62+
logger.debug(e.localizedMessage, e)
6163
null
6264
}
6365
}
@@ -125,6 +127,7 @@ class S3StorageImpl(private val client: S3Client, private val preSigner: S3Presi
125127
client.headBucket(HeadBucketRequest.builder().bucket(bucket).build())
126128
true
127129
} catch (e: NoSuchBucketException) {
130+
logger.debug(e.localizedMessage, e)
128131
false
129132
}
130133
}
@@ -139,11 +142,13 @@ class S3StorageImpl(private val client: S3Client, private val preSigner: S3Presi
139142
)
140143
true
141144
} catch (e: BucketAlreadyExistsException) {
145+
logger.debug(e.localizedMessage, e)
142146
false
143147
} catch (e: BucketAlreadyOwnedByYouException) {
148+
logger.debug(e.localizedMessage, e)
144149
false
145150
} catch (e: S3Exception) {
146-
logger.error(e.localizedMessage, e)
151+
logger.debug(e.localizedMessage, e)
147152
false
148153
}
149154
}
@@ -153,6 +158,7 @@ class S3StorageImpl(private val client: S3Client, private val preSigner: S3Presi
153158
client.deleteBucket(DeleteBucketRequest.builder().bucket(bucket).build())
154159
true
155160
} catch (e: NoSuchBucketException) {
161+
logger.debug(e.localizedMessage, e)
156162
false
157163
}
158164
}
@@ -174,6 +180,7 @@ class S3StorageImpl(private val client: S3Client, private val preSigner: S3Presi
174180
)
175181
true
176182
} catch (e: NoSuchKeyException) {
183+
logger.debug(e.localizedMessage, e)
177184
false
178185
}
179186
}
@@ -182,6 +189,7 @@ class S3StorageImpl(private val client: S3Client, private val preSigner: S3Presi
182189
return put(bucket, key, stream.buffered(), metadata)
183190
}
184191

192+
@Deprecated("Pointless method that simply wraps byteArray")
185193
override fun put(bucket: String, key: String, byteArray: ByteArray, metadata: Map<String, String>?): Boolean {
186194
val stream = byteArray.inputStream().buffered()
187195
return put(bucket, key, stream, metadata)
@@ -202,6 +210,28 @@ class S3StorageImpl(private val client: S3Client, private val preSigner: S3Presi
202210
client.putObject(request, RequestBody.fromBytes(stream.readBytes()))
203211
true
204212
} catch (e: S3Exception) {
213+
logger.debug(e.localizedMessage, e)
214+
false
215+
}
216+
}
217+
218+
override fun put(bucket: String, key: String, file: FileObjectDto, metadata: Map<String, String>?): Boolean {
219+
220+
val request = PutObjectRequest.builder()
221+
.bucket(bucket)
222+
.key(key)
223+
.acl(ObjectCannedACL.PUBLIC_READ)
224+
.contentEncoding("UTF-8")
225+
.contentType(MimeTypeDetector.detect(file.inputStream).toString())
226+
.metadata(metadata ?: emptyMap())
227+
.contentLength(file.size)
228+
.build()
229+
230+
return try {
231+
client.putObject(request, RequestBody.fromInputStream(file.inputStream, file.size))
232+
true
233+
} catch (e: S3Exception) {
234+
logger.debug(e.localizedMessage, e)
205235
false
206236
}
207237
}
@@ -219,8 +249,10 @@ class S3StorageImpl(private val client: S3Client, private val preSigner: S3Presi
219249
client.copyObject(request)
220250
true
221251
} catch (e: NoSuchBucketException) {
252+
logger.debug(e.localizedMessage, e)
222253
false
223254
} catch (e: NoSuchKeyException) {
255+
logger.debug(e.localizedMessage, e)
224256
false
225257
}
226258
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.icerockdev.service.storage.s3.dto
2+
3+
import java.io.BufferedInputStream
4+
5+
data class FileObjectDto(
6+
val inputStream: BufferedInputStream,
7+
val size: Long
8+
)

storage-service/src/test/kotlin/S3StorageTest.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.icerockdev.service.storage.mime.MimeTypeDetector
88
import com.icerockdev.service.storage.s3.IS3Storage
99
import com.icerockdev.service.storage.s3.S3StorageImpl
1010
import com.icerockdev.service.storage.s3.minioConfBuilder
11+
import com.icerockdev.service.storage.s3.dto.FileObjectDto
1112
import com.icerockdev.service.storage.s3.policy.dto.ActionEnum
1213
import com.icerockdev.service.storage.s3.policy.dto.EffectEnum
1314
import com.icerockdev.service.storage.s3.policy.dto.Policy
@@ -253,15 +254,13 @@ class S3StorageTest {
253254

254255
val (jpgFileName, jpgStream) = getFile(FileType.JPG)
255256
val mimeType = MimeTypeDetector.detect(jpgStream)
256-
val jpgFileByteArray = jpgStream.readAllBytes()
257-
258-
jpgStream.close()
257+
val fileSize = jpgStream.available().toLong()
259258

260259
// Check wrong cases
261260
assertFalse(storage.objectExists(bucketName, jpgFileName))
262261

263262
// Put object to storage
264-
assertTrue(storage.put(bucketName, jpgFileName, jpgFileByteArray.inputStream()))
263+
assertTrue(storage.put(bucketName, jpgFileName, FileObjectDto(jpgStream.buffered(), fileSize)))
265264

266265
// Check object exist
267266
assertTrue(storage.objectExists(bucketName, jpgFileName))
@@ -271,7 +270,7 @@ class S3StorageTest {
271270
assertEquals("image/jpeg", mimeType.toString())
272271
assertEquals(mimeType.toString(), jpgObject?.response()?.contentType())
273272

274-
assertEquals(jpgFileByteArray.size.toLong(), jpgObject?.response()?.contentLength())
273+
assertEquals(fileSize, jpgObject?.response()?.contentLength())
275274

276275
assertTrue {
277276
storage.deleteBucketWithObjects(bucketName)

0 commit comments

Comments
 (0)