From f324a1814eb00d7e52851e0231353d4dd610d7f9 Mon Sep 17 00:00:00 2001 From: seheonnn Date: Mon, 1 Jul 2024 18:41:55 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20S3=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core-infra-s3/build.gradle | 2 + .../com/sponus/coreinfras3/S3Service.java | 79 +++++++++++++++---- 2 files changed, 67 insertions(+), 14 deletions(-) diff --git a/core/core-infra-s3/build.gradle b/core/core-infra-s3/build.gradle index 6835552e..f959c1e5 100644 --- a/core/core-infra-s3/build.gradle +++ b/core/core-infra-s3/build.gradle @@ -2,6 +2,8 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' implementation 'com.sksamuel.scrimage:scrimage-core:4.1.1' implementation 'com.sksamuel.scrimage:scrimage-webp:4.1.1' + implementation 'com.amazonaws:aws-java-sdk-s3:1.12.524' + implementation 'org.springframework.boot:spring-boot-starter-webflux' } bootJar { enabled = false } diff --git a/core/core-infra-s3/src/main/java/com/sponus/coreinfras3/S3Service.java b/core/core-infra-s3/src/main/java/com/sponus/coreinfras3/S3Service.java index b9a01f9c..a945e97e 100644 --- a/core/core-infra-s3/src/main/java/com/sponus/coreinfras3/S3Service.java +++ b/core/core-infra-s3/src/main/java/com/sponus/coreinfras3/S3Service.java @@ -1,16 +1,25 @@ package com.sponus.coreinfras3; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; import java.nio.file.Files; +import java.util.Calendar; +import java.util.Date; import java.util.List; import java.util.UUID; +import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.reactive.function.client.WebClient; +import com.amazonaws.HttpMethod; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.PutObjectRequest; import com.sponus.coreinfras3.convert.webp.WebpConvertService; import com.sponus.coreinfras3.util.FileUtils; @@ -43,19 +52,6 @@ public String uploadFile(MultipartFile multipartFile) { return uploadFile(file); } - public String uploadFile(File file) { - String fileName = getFileNamePrefix() + file.getName(); - - amazonS3.putObject(new PutObjectRequest(s3Config.getBucket(), s3Config.getFolder() + fileName, file)); - try { - Files.delete(file.toPath()); - } catch (IOException e) { - throw new IllegalArgumentException("Failed to delete file", e); - } - - return amazonS3.getUrl(s3Config.getBucket(), s3Config.getFolder() + fileName).toString(); - } - public String deleteFile(String image) { try { amazonS3.deleteObject(s3Config.getBucket(), s3Config.getFolder() + image); @@ -74,4 +70,59 @@ public List uploadFiles(List files) { private String getFileNamePrefix() { return UUID.randomUUID().toString().substring(0, 5) + "-"; } + + public String generatePreSignUrl(String fileName) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.MINUTE, 10); //validfy of 10 minutes + return amazonS3.generatePresignedUrl(s3Config.getBucket(), fileName, calendar.getTime(), HttpMethod.PUT) + .toString(); + } + + public String uploadFile(File file) { + String fileName = s3Config.getFolder() + getFileNamePrefix() + file.getName(); + String preSignedUrl = generatePreSignUrl(fileName); + + // log.info("preSignedUrl : {}", preSignedUrl); + try { + uploadFileToS3UsingPreSignedUrl(preSignedUrl, file); + } catch (IOException e) { + throw new IllegalArgumentException("Failed to upload file", e); + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Failed to parsing uri"); + } + + // 로컬 파일 삭제 + try { + Files.delete(file.toPath()); + } catch (IOException e) { + throw new IllegalArgumentException("Failed to delete file", e); + } + + return amazonS3.getUrl(s3Config.getBucket(), fileName).toString(); + } + + private void uploadFileToS3UsingPreSignedUrl(String preSignedUrl, File file) throws URISyntaxException, + IOException { + + URI uri = new URI(preSignedUrl); + WebClient webClient = WebClient.create(); + + byte[] fileBytes = readFileToBytes(file); + + webClient.put() + .uri(uri) + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .bodyValue(fileBytes) + .retrieve().toBodilessEntity().block(); + } + + private byte[] readFileToBytes(File file) throws IOException { + try (FileInputStream fileInputStream = new FileInputStream(file); + FileChannel fileChannel = fileInputStream.getChannel()) { + ByteBuffer byteBuffer = ByteBuffer.allocate((int)fileChannel.size()); + fileChannel.read(byteBuffer); + return byteBuffer.array(); + } + } }