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 @@ -19,8 +19,8 @@ public class VideoController {
@GetMapping("/videos/upload")
@PreAuthorize("hasRole('ADMIN')")
@Operation(summary = "업로드용 URL 요청", description = "파일 업로드를 위한 Presigned URL을 발급받습니다.")
public RsData<UploadUrlGetResponse> getUploadUrl() {
PresignedUrlResponse uploadUrl = fileManager.getUploadUrl();
public RsData<UploadUrlGetResponse> getUploadUrl(@RequestParam String filename) {
PresignedUrlResponse uploadUrl = fileManager.getUploadUrl(filename);
UploadUrlGetResponse response = new UploadUrlGetResponse(uploadUrl.url().toString(), uploadUrl.expiresAt());
return new RsData<>("200", "업로드용 URL 요청완료", response);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import com.back.domain.file.video.dto.service.PresignedUrlResponse;
import com.back.global.exception.ServiceException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -15,14 +16,42 @@ public class FileManager {
private final VideoService videoService;
private final S3Service s3Service;

public PresignedUrlResponse getUploadUrl() {
public PresignedUrlResponse getUploadUrl(String filename) {
String contentType = validateAndGetContentType(filename);
String ext = extractExt(filename);
String uuid = UUID.randomUUID().toString();
String objectKey = "videos/" + uuid + "." + ext;
Integer expires = 5;
URL url = s3Service.generateUploadUrl("videos/"+uuid, expires);
URL url = s3Service.generateUploadUrl(objectKey, expires, contentType);
LocalDateTime expiresAt = LocalDateTime.now().plusMinutes(expires);
return new PresignedUrlResponse(url, expiresAt);
}

private String extractExt(String filename) {
int pos = filename.lastIndexOf(".");
return filename.substring(pos + 1);
}

private String validateAndGetContentType(String filename) {
String ext = extractExt(filename).toLowerCase();
switch (ext) {
case "mp4":
return "video/mp4";
case "mov":
return "video/quicktime";
case "avi":
return "video/x-msvideo";
case "wmv":
return "video/x-ms-wmv";
case "mkv":
return "video/x-matroska";
case "webm":
return "video/webm";
default:
throw new ServiceException("400", "지원하지 않는 동영상 파일 형식입니다: " + ext);
}
}

public PresignedUrlResponse getDownloadUrl(String objectKey) {
Integer expires = 60;
URL url = s3Service.generateDownloadUrl(objectKey, expires);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ public class S3Service {
@Value("${aws.s3.bucket}")
private String bucket;

public URL generateUploadUrl(String objectKey, Integer expireMinutes) {
public URL generateUploadUrl(String objectKey, Integer expireMinutes, String contentType) {
validateRequest(objectKey);

PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucket)
.key(objectKey)
.contentType(contentType)
.build();

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

public URL generateUploadUrl(String objectKey) {
return generateUploadUrl(objectKey, 30);
public URL generateUploadUrl(String objectKey, String contentType) {
return generateUploadUrl(objectKey, 30, contentType);
}

public URL generateDownloadUrl(String objectKey, Integer expireMinutes) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void generateUploadUrlTest() throws MalformedURLException {

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

URL url = s3Service.generateUploadUrl(objectKey);
URL url = s3Service.generateUploadUrl(objectKey, "video/mp4");

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

try {
s3Service.generateUploadUrl(objectKey);
s3Service.generateUploadUrl(objectKey, "video/mp4");
} catch (Exception e) {
assertThat(e).isInstanceOf(ServiceException.class);
}
Expand Down