diff --git a/src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java b/src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java
index 30ebaa6..bd22056 100644
--- a/src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java
+++ b/src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java
@@ -30,10 +30,6 @@ public enum ErrorStatus implements BaseErrorCode {
INVALID_OAUTH_PROVIDER(HttpStatus.BAD_REQUEST, "AUTH406", "유효하지 않은 OAuth 제공자입니다."),
AWS_SERVICE_UNAVAILABLE(HttpStatus.BAD_REQUEST, "AWS400", "AWS S3에 파일을 업로드할 수 없습니다."),
- AWS_METHOD_NOT_ALLOWED(
- HttpStatus.METHOD_NOT_ALLOWED,
- "AWS405",
- "AWS S3 presigned url에서 해당 method는 허용되지 않습니다."),
MUSIC_NOT_FOUND(HttpStatus.BAD_REQUEST, "MUSIC400", "음원을 찾을 수 없습니다."),
diff --git a/src/main/java/umc/codeplay/config/SwaggerConfig.java b/src/main/java/umc/codeplay/config/SwaggerConfig.java
index 2c856de..e6a251b 100644
--- a/src/main/java/umc/codeplay/config/SwaggerConfig.java
+++ b/src/main/java/umc/codeplay/config/SwaggerConfig.java
@@ -19,7 +19,10 @@ public OpenAPI CodePlayAPI() {
Info info =
new Info()
.title("CodePlay Server API")
- .description("UMC 7th Code Play Server API 문서")
+ .description(
+ "
UMC 7th Code Play Server API 문서.
"
+ + "자세한 작동 방식 등은 Front-End 태그가 담긴 discussion 확인 부탁드립니다.
"
+ + "https://github.com/UMC-CodePlay/CodePlay-BE/discussions")
.version("1.0");
String securitySchemeName = "JWT TOKEN";
diff --git a/src/main/java/umc/codeplay/controller/FileController.java b/src/main/java/umc/codeplay/controller/FileController.java
index d22fab0..1756614 100644
--- a/src/main/java/umc/codeplay/controller/FileController.java
+++ b/src/main/java/umc/codeplay/controller/FileController.java
@@ -6,7 +6,6 @@
import lombok.RequiredArgsConstructor;
import io.swagger.v3.oas.annotations.Operation;
-import software.amazon.awssdk.http.SdkHttpMethod;
import umc.codeplay.apiPayLoad.ApiResponse;
import umc.codeplay.dto.FileResponseDTO;
import umc.codeplay.service.FileService;
@@ -25,10 +24,9 @@ public class FileController {
description = "다운로드를 위한 Presigned URL 생성 - 유효시간 존재")
@GetMapping("/download")
public ApiResponse getUrl(
- @RequestParam(value = "fileName") String fileName) {
- String downloadUrl = fileService.generatePreSignedUrl(fileName, SdkHttpMethod.GET);
+ @RequestParam(value = "musicId") Long musicId) {
+ String downloadUrl = fileService.generateGetPresignedUrl(musicId);
FileResponseDTO.DownloadFile result = new FileResponseDTO.DownloadFile(downloadUrl);
-
return ApiResponse.onSuccess(result);
}
@@ -38,11 +36,13 @@ public ApiResponse getUrl(
@PostMapping("/upload")
public ApiResponse generateUrl(
@RequestParam(value = "fileName") String fileName) {
+
String username = SecurityContextHolder.getContext().getAuthentication().getName();
String newFileName = buildFilename(fileName);
+ System.out.println(newFileName);
Long musicId = fileService.uploadMusic(newFileName, username);
- String uploadUrl = fileService.generatePreSignedUrl(newFileName, SdkHttpMethod.PUT);
+ String uploadUrl = fileService.generatePutPresignedUrl(newFileName);
FileResponseDTO.UploadFile result = new FileResponseDTO.UploadFile(uploadUrl, musicId);
return ApiResponse.onSuccess(result);
}
diff --git a/src/main/java/umc/codeplay/service/FileService.java b/src/main/java/umc/codeplay/service/FileService.java
index 06e6cd5..5a438b9 100644
--- a/src/main/java/umc/codeplay/service/FileService.java
+++ b/src/main/java/umc/codeplay/service/FileService.java
@@ -8,7 +8,6 @@
import lombok.RequiredArgsConstructor;
-import software.amazon.awssdk.http.SdkHttpMethod;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
@@ -45,47 +44,53 @@ public static String buildFilename(String filename) {
// 특수 문자나 공백 등을 정리
private static String sanitizeFileName(String fileName) {
String normalizedFileName = Normalizer.normalize(fileName, Normalizer.Form.NFC);
- return normalizedFileName.replaceAll("\\s+", "_").replaceAll("[^a-zA-Z0-9.\\-_]", "");
- }
-
- // 파일 업로드(HTTP PUT) 또는 다운로드(HTTP GET)를 위한 Presigned URL 생성
- public String generatePreSignedUrl(String fileName, SdkHttpMethod method) {
-
- return switch (method) {
- case GET -> generateGetPresignedUrl(fileName);
- case PUT -> generatePutPresignedUrl(fileName);
- default -> throw new GeneralHandler(ErrorStatus.AWS_SERVICE_UNAVAILABLE);
- };
+ System.out.println(normalizedFileName);
+ return normalizedFileName.replaceAll("\\s+", "_").replaceAll("[^가-힣a-zA-Z0-9.\\-_]", "_");
}
// S3에서 파일을 다운로드할 수 있는 Presigned URL 생성
- private String generateGetPresignedUrl(String fileName) {
- GetObjectRequest getObjectRequest =
- GetObjectRequest.builder().bucket(bucketName).key(fileName).build();
-
- GetObjectPresignRequest presignRequest =
- GetObjectPresignRequest.builder()
- .signatureDuration(Duration.ofMinutes(60))
- .getObjectRequest(getObjectRequest)
- .build();
-
- PresignedGetObjectRequest presignedRequest = s3Presigner.presignGetObject(presignRequest);
- return presignedRequest.url().toString();
+ public String generateGetPresignedUrl(Long musicId) {
+ try {
+ Music music =
+ musicRepository
+ .findById(musicId)
+ .orElseThrow(() -> new GeneralHandler(ErrorStatus.MUSIC_NOT_FOUND));
+
+ GetObjectRequest getObjectRequest =
+ GetObjectRequest.builder().bucket(bucketName).key(music.getTitle()).build();
+
+ GetObjectPresignRequest presignRequest =
+ GetObjectPresignRequest.builder()
+ .signatureDuration(Duration.ofMinutes(60))
+ .getObjectRequest(getObjectRequest)
+ .build();
+
+ PresignedGetObjectRequest presignedRequest =
+ s3Presigner.presignGetObject(presignRequest);
+ return presignedRequest.url().toString();
+ } catch (Exception e) {
+ throw new GeneralHandler(ErrorStatus.AWS_SERVICE_UNAVAILABLE);
+ }
}
// S3에 파일을 업로드할 수 있는 Presigned URL 생성
- private String generatePutPresignedUrl(String fileName) {
- PutObjectRequest putObjectRequest =
- PutObjectRequest.builder().bucket(bucketName).key(fileName).build();
-
- PutObjectPresignRequest presignRequest =
- PutObjectPresignRequest.builder()
- .signatureDuration(Duration.ofMinutes(60))
- .putObjectRequest(putObjectRequest)
- .build();
-
- PresignedPutObjectRequest presignedRequest = s3Presigner.presignPutObject(presignRequest);
- return presignedRequest.url().toString();
+ public String generatePutPresignedUrl(String fileName) {
+ try {
+ PutObjectRequest putObjectRequest =
+ PutObjectRequest.builder().bucket(bucketName).key(fileName).build();
+
+ PutObjectPresignRequest presignRequest =
+ PutObjectPresignRequest.builder()
+ .signatureDuration(Duration.ofMinutes(60))
+ .putObjectRequest(putObjectRequest)
+ .build();
+
+ PresignedPutObjectRequest presignedRequest =
+ s3Presigner.presignPutObject(presignRequest);
+ return presignedRequest.url().toString();
+ } catch (Exception e) {
+ throw new GeneralHandler(ErrorStatus.AWS_SERVICE_UNAVAILABLE);
+ }
}
// music 레포지토리에 업로드