|
1 | 1 | package io.wisoft.prepair.prepair_api.storage; |
2 | 2 |
|
3 | | -import io.wisoft.prepair.prepair_api.global.exception.BusinessException; |
4 | | -import io.wisoft.prepair.prepair_api.global.exception.ErrorCode; |
5 | | - |
6 | | -import java.io.IOException; |
7 | 3 | import java.nio.file.Path; |
8 | | -import java.time.Duration; |
9 | 4 | import java.time.LocalDate; |
10 | 5 | import java.util.UUID; |
11 | 6 |
|
12 | 7 | import lombok.RequiredArgsConstructor; |
13 | 8 | import lombok.extern.slf4j.Slf4j; |
14 | 9 | import org.springframework.beans.factory.annotation.Value; |
15 | 10 | import org.springframework.stereotype.Component; |
16 | | -import org.springframework.web.multipart.MultipartFile; |
17 | 11 | import software.amazon.awssdk.core.sync.RequestBody; |
18 | 12 | import software.amazon.awssdk.services.s3.S3Client; |
19 | | -import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; |
20 | | -import software.amazon.awssdk.services.s3.model.GetObjectRequest; |
21 | 13 | import software.amazon.awssdk.services.s3.model.PutObjectRequest; |
22 | | -import software.amazon.awssdk.services.s3.presigner.S3Presigner; |
23 | 14 |
|
24 | 15 | @Slf4j |
25 | 16 | @Component |
26 | 17 | @RequiredArgsConstructor |
27 | 18 | public class FileUploader { |
28 | 19 |
|
29 | 20 | private final S3Client s3Client; |
30 | | - private final S3Presigner s3Presigner; |
31 | 21 |
|
32 | 22 | @Value("${cloud.aws.s3.bucket}") |
33 | 23 | private String bucket; |
34 | 24 |
|
35 | 25 | @Value("${cloud.aws.s3.endpoint}") |
36 | 26 | private String endpoint; |
37 | 27 |
|
38 | | - @Value("${cloud.aws.s3.presigned-url-expiration}") |
39 | | - private long presignedUrlExpiration; |
40 | | - |
41 | | - public String upload(MultipartFile file, String email) { |
42 | | - try { |
43 | | - return upload(file.getBytes(), file.getContentType(), file.getOriginalFilename(), email); |
44 | | - } catch (IOException e) { |
45 | | - log.error("영상 S3 업로드 실패 - bucket: {}, error: {}", bucket, e.getMessage(), e); |
46 | | - throw new BusinessException(ErrorCode.FILE_UPLOAD_FAILED); |
47 | | - } |
48 | | - } |
49 | | - |
50 | | - public String upload(byte[] bytes, String contentType, String originalFilename, String email) { |
51 | | - String extension = getExtension(originalFilename); |
| 28 | + public String upload(Path videoPath, String contentType, String email) { |
| 29 | + String extension = getExtension(videoPath.getFileName().toString()); |
52 | 30 | String key = "interview-video/" + email + "/" + LocalDate.now() + "/" + UUID.randomUUID() + extension; |
53 | 31 |
|
54 | 32 | s3Client.putObject(PutObjectRequest.builder() |
55 | 33 | .bucket(bucket) |
56 | 34 | .key(key) |
57 | 35 | .contentType(contentType) |
58 | 36 | .build(), |
59 | | - RequestBody.fromBytes(bytes) |
60 | | - ); |
61 | | - |
62 | | - String url = endpoint + "/" + bucket + "/" + key; |
63 | | - log.info("영상 S3 업로드 완료 - key: {}", key); |
64 | | - return url; |
65 | | - } |
66 | | - |
67 | | - public Path download(String mediaUrl) { |
68 | | - try { |
69 | | - String key = extractKey(mediaUrl); |
70 | | - Path tempFile = Path.of(System.getProperty("java.io.tmpdir"), "video-" + UUID.randomUUID() + ".tmp"); |
71 | | - |
72 | | - s3Client.getObject(GetObjectRequest.builder() |
73 | | - .bucket(bucket) |
74 | | - .key(key) |
75 | | - .build(), tempFile); |
76 | | - |
77 | | - log.info("영상 S3 다운로드 완료 - key: {}", key); |
78 | | - return tempFile; |
79 | | - } catch (Exception e) { |
80 | | - log.error("영상 S3 다운로드 실패 - mediaUrl: {}, error: {}", mediaUrl, e.getMessage(), e); |
81 | | - throw new BusinessException(ErrorCode.FILE_DOWNLOAD_FAILED); |
82 | | - } |
83 | | - } |
84 | | - |
85 | | - public void delete(String mediaUrl) { |
86 | | - String key = extractKey(mediaUrl); |
87 | | - s3Client.deleteObject(DeleteObjectRequest.builder() |
88 | | - .bucket(bucket) |
89 | | - .key(key) |
90 | | - .build() |
| 37 | + RequestBody.fromFile(videoPath) |
91 | 38 | ); |
92 | | - log.info("영상 S3 삭제 완료 - key: {}", key); |
93 | | - } |
94 | | - |
95 | | - public String generatePresignedUrl(String mediaUrl) { |
96 | | - String key = extractKey(mediaUrl); |
97 | | - String presignedUrl = s3Presigner.presignGetObject( |
98 | | - p -> p.signatureDuration(Duration.ofSeconds(presignedUrlExpiration)) |
99 | | - .getObjectRequest( |
100 | | - g -> g.bucket(bucket).key(key).build()).build() |
101 | | - ).url().toString(); |
102 | | - |
103 | | - log.info("Presigned URL 발급 - key: {}", key); |
104 | | - return presignedUrl; |
105 | | - } |
106 | 39 |
|
107 | | - private String extractKey(String mediaUrl) { |
108 | | - String prefix = endpoint + "/" + bucket + "/"; |
109 | | - return mediaUrl.substring(prefix.length()); |
| 40 | + return endpoint + "/" + bucket + "/" + key; |
110 | 41 | } |
111 | 42 |
|
112 | 43 | private String getExtension(String filename) { |
|
0 commit comments