Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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", "음원을 찾을 수 없습니다."),

Expand Down
5 changes: 4 additions & 1 deletion src/main/java/umc/codeplay/config/SwaggerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ public OpenAPI CodePlayAPI() {
Info info =
new Info()
.title("CodePlay Server API")
.description("UMC 7th Code Play Server API 문서")
.description(
"<div>UMC 7th Code Play Server API 문서.</div>"
+ "<div>자세한 작동 방식 등은 Front-End 태그가 담긴 discussion 확인 부탁드립니다.</div>"
+ "https://github.com/UMC-CodePlay/CodePlay-BE/discussions")
.version("1.0");

String securitySchemeName = "JWT TOKEN";
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/umc/codeplay/controller/FileController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,10 +24,9 @@ public class FileController {
description = "다운로드를 위한 Presigned URL 생성 - 유효시간 존재")
@GetMapping("/download")
public ApiResponse<FileResponseDTO.DownloadFile> 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);
}

Expand All @@ -38,11 +36,13 @@ public ApiResponse<FileResponseDTO.DownloadFile> getUrl(
@PostMapping("/upload")
public ApiResponse<FileResponseDTO.UploadFile> 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);
}
Expand Down
77 changes: 41 additions & 36 deletions src/main/java/umc/codeplay/service/FileService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 레포지토리에 업로드
Expand Down
Loading