Skip to content

Commit 431c833

Browse files
authored
파일 업로드시 변경사항 적용 (#230)
* Feat : 파일 업로드시 원본 파일명을 받도록 수정 * Feat : 파일명으로부터 확장자를 체크하고 획득하며 URL생성시 사용하도록 수정
1 parent a1e8261 commit 431c833

File tree

4 files changed

+39
-9
lines changed

4 files changed

+39
-9
lines changed

back/src/main/java/com/back/domain/file/video/controller/VideoController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public class VideoController {
1919
@GetMapping("/videos/upload")
2020
@PreAuthorize("hasRole('ADMIN')")
2121
@Operation(summary = "업로드용 URL 요청", description = "파일 업로드를 위한 Presigned URL을 발급받습니다.")
22-
public RsData<UploadUrlGetResponse> getUploadUrl() {
23-
PresignedUrlResponse uploadUrl = fileManager.getUploadUrl();
22+
public RsData<UploadUrlGetResponse> getUploadUrl(@RequestParam String filename) {
23+
PresignedUrlResponse uploadUrl = fileManager.getUploadUrl(filename);
2424
UploadUrlGetResponse response = new UploadUrlGetResponse(uploadUrl.url().toString(), uploadUrl.expiresAt());
2525
return new RsData<>("200", "업로드용 URL 요청완료", response);
2626
}

back/src/main/java/com/back/domain/file/video/service/FileManager.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33

44
import com.back.domain.file.video.dto.service.PresignedUrlResponse;
5+
import com.back.global.exception.ServiceException;
56
import lombok.RequiredArgsConstructor;
67
import org.springframework.stereotype.Service;
78

@@ -15,14 +16,42 @@ public class FileManager {
1516
private final VideoService videoService;
1617
private final S3Service s3Service;
1718

18-
public PresignedUrlResponse getUploadUrl() {
19+
public PresignedUrlResponse getUploadUrl(String filename) {
20+
String contentType = validateAndGetContentType(filename);
21+
String ext = extractExt(filename);
1922
String uuid = UUID.randomUUID().toString();
23+
String objectKey = "videos/" + uuid + "." + ext;
2024
Integer expires = 5;
21-
URL url = s3Service.generateUploadUrl("videos/"+uuid, expires);
25+
URL url = s3Service.generateUploadUrl(objectKey, expires, contentType);
2226
LocalDateTime expiresAt = LocalDateTime.now().plusMinutes(expires);
2327
return new PresignedUrlResponse(url, expiresAt);
2428
}
2529

30+
private String extractExt(String filename) {
31+
int pos = filename.lastIndexOf(".");
32+
return filename.substring(pos + 1);
33+
}
34+
35+
private String validateAndGetContentType(String filename) {
36+
String ext = extractExt(filename).toLowerCase();
37+
switch (ext) {
38+
case "mp4":
39+
return "video/mp4";
40+
case "mov":
41+
return "video/quicktime";
42+
case "avi":
43+
return "video/x-msvideo";
44+
case "wmv":
45+
return "video/x-ms-wmv";
46+
case "mkv":
47+
return "video/x-matroska";
48+
case "webm":
49+
return "video/webm";
50+
default:
51+
throw new ServiceException("400", "지원하지 않는 동영상 파일 형식입니다: " + ext);
52+
}
53+
}
54+
2655
public PresignedUrlResponse getDownloadUrl(String objectKey) {
2756
Integer expires = 60;
2857
URL url = s3Service.generateDownloadUrl(objectKey, expires);

back/src/main/java/com/back/domain/file/video/service/S3Service.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ public class S3Service {
2121
@Value("${aws.s3.bucket}")
2222
private String bucket;
2323

24-
public URL generateUploadUrl(String objectKey, Integer expireMinutes) {
24+
public URL generateUploadUrl(String objectKey, Integer expireMinutes, String contentType) {
2525
validateRequest(objectKey);
2626

2727
PutObjectRequest request = PutObjectRequest.builder()
2828
.bucket(bucket)
2929
.key(objectKey)
30+
.contentType(contentType)
3031
.build();
3132

3233
PresignedPutObjectRequest presignedRequest =
@@ -41,8 +42,8 @@ public URL generateUploadUrl(String objectKey, Integer expireMinutes) {
4142
return presignedRequest.url();
4243
}
4344

44-
public URL generateUploadUrl(String objectKey) {
45-
return generateUploadUrl(objectKey, 30);
45+
public URL generateUploadUrl(String objectKey, String contentType) {
46+
return generateUploadUrl(objectKey, 30, contentType);
4647
}
4748

4849
public URL generateDownloadUrl(String objectKey, Integer expireMinutes) {

back/src/test/java/com/back/domain/file/service/S3ServiceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ void generateUploadUrlTest() throws MalformedURLException {
4646

4747
when(mocked.url()).thenReturn(new URL("http://localhost:8080/upload"));
4848

49-
URL url = s3Service.generateUploadUrl(objectKey);
49+
URL url = s3Service.generateUploadUrl(objectKey, "video/mp4");
5050

5151
assertThat(url).isNotNull();
5252
assertThat(url.toString()).isEqualTo("http://localhost:8080/upload");
@@ -77,7 +77,7 @@ void generateUploadUrl_PresignRequestNull_Test() {
7777
when(presigner.presignPutObject(any(Consumer.class))).thenReturn(null);
7878

7979
try {
80-
s3Service.generateUploadUrl(objectKey);
80+
s3Service.generateUploadUrl(objectKey, "video/mp4");
8181
} catch (Exception e) {
8282
assertThat(e).isInstanceOf(ServiceException.class);
8383
}

0 commit comments

Comments
 (0)