Skip to content

Commit 6159860

Browse files
authored
refactor: S3 개선 (#345)
1 parent fcbcd8c commit 6159860

File tree

2 files changed

+67
-14
lines changed

2 files changed

+67
-14
lines changed

core/core-infra-s3/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ dependencies {
22
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
33
implementation 'com.sksamuel.scrimage:scrimage-core:4.1.1'
44
implementation 'com.sksamuel.scrimage:scrimage-webp:4.1.1'
5+
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.524'
6+
implementation 'org.springframework.boot:spring-boot-starter-webflux'
57
}
68

79
bootJar { enabled = false }

core/core-infra-s3/src/main/java/com/sponus/coreinfras3/S3Service.java

+65-14
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
package com.sponus.coreinfras3;
22

33
import java.io.File;
4+
import java.io.FileInputStream;
45
import java.io.IOException;
6+
import java.net.URI;
7+
import java.net.URISyntaxException;
8+
import java.nio.ByteBuffer;
9+
import java.nio.channels.FileChannel;
510
import java.nio.file.Files;
11+
import java.util.Calendar;
12+
import java.util.Date;
613
import java.util.List;
714
import java.util.UUID;
815

16+
import org.springframework.http.MediaType;
917
import org.springframework.stereotype.Service;
1018
import org.springframework.web.multipart.MultipartFile;
19+
import org.springframework.web.reactive.function.client.WebClient;
1120

21+
import com.amazonaws.HttpMethod;
1222
import com.amazonaws.services.s3.AmazonS3;
13-
import com.amazonaws.services.s3.model.PutObjectRequest;
1423
import com.sponus.coreinfras3.convert.webp.WebpConvertService;
1524
import com.sponus.coreinfras3.util.FileUtils;
1625

@@ -43,19 +52,6 @@ public String uploadFile(MultipartFile multipartFile) {
4352
return uploadFile(file);
4453
}
4554

46-
public String uploadFile(File file) {
47-
String fileName = getFileNamePrefix() + file.getName();
48-
49-
amazonS3.putObject(new PutObjectRequest(s3Config.getBucket(), s3Config.getFolder() + fileName, file));
50-
try {
51-
Files.delete(file.toPath());
52-
} catch (IOException e) {
53-
throw new IllegalArgumentException("Failed to delete file", e);
54-
}
55-
56-
return amazonS3.getUrl(s3Config.getBucket(), s3Config.getFolder() + fileName).toString();
57-
}
58-
5955
public String deleteFile(String image) {
6056
try {
6157
amazonS3.deleteObject(s3Config.getBucket(), s3Config.getFolder() + image);
@@ -74,4 +70,59 @@ public List<String> uploadFiles(List<MultipartFile> files) {
7470
private String getFileNamePrefix() {
7571
return UUID.randomUUID().toString().substring(0, 5) + "-";
7672
}
73+
74+
public String generatePreSignUrl(String fileName) {
75+
Calendar calendar = Calendar.getInstance();
76+
calendar.setTime(new Date());
77+
calendar.add(Calendar.MINUTE, 10); //validfy of 10 minutes
78+
return amazonS3.generatePresignedUrl(s3Config.getBucket(), fileName, calendar.getTime(), HttpMethod.PUT)
79+
.toString();
80+
}
81+
82+
public String uploadFile(File file) {
83+
String fileName = s3Config.getFolder() + getFileNamePrefix() + file.getName();
84+
String preSignedUrl = generatePreSignUrl(fileName);
85+
86+
// log.info("preSignedUrl : {}", preSignedUrl);
87+
try {
88+
uploadFileToS3UsingPreSignedUrl(preSignedUrl, file);
89+
} catch (IOException e) {
90+
throw new IllegalArgumentException("Failed to upload file", e);
91+
} catch (URISyntaxException e) {
92+
throw new IllegalArgumentException("Failed to parsing uri");
93+
}
94+
95+
// 로컬 파일 삭제
96+
try {
97+
Files.delete(file.toPath());
98+
} catch (IOException e) {
99+
throw new IllegalArgumentException("Failed to delete file", e);
100+
}
101+
102+
return amazonS3.getUrl(s3Config.getBucket(), fileName).toString();
103+
}
104+
105+
private void uploadFileToS3UsingPreSignedUrl(String preSignedUrl, File file) throws URISyntaxException,
106+
IOException {
107+
108+
URI uri = new URI(preSignedUrl);
109+
WebClient webClient = WebClient.create();
110+
111+
byte[] fileBytes = readFileToBytes(file);
112+
113+
webClient.put()
114+
.uri(uri)
115+
.contentType(MediaType.APPLICATION_OCTET_STREAM)
116+
.bodyValue(fileBytes)
117+
.retrieve().toBodilessEntity().block();
118+
}
119+
120+
private byte[] readFileToBytes(File file) throws IOException {
121+
try (FileInputStream fileInputStream = new FileInputStream(file);
122+
FileChannel fileChannel = fileInputStream.getChannel()) {
123+
ByteBuffer byteBuffer = ByteBuffer.allocate((int)fileChannel.size());
124+
fileChannel.read(byteBuffer);
125+
return byteBuffer.array();
126+
}
127+
}
77128
}

0 commit comments

Comments
 (0)