-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathFileService.java
More file actions
96 lines (77 loc) · 3.71 KB
/
FileService.java
File metadata and controls
96 lines (77 loc) · 3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package umc.codeplay.service;
import java.text.Normalizer;
import java.time.Duration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;
import umc.codeplay.apiPayLoad.code.status.ErrorStatus;
import umc.codeplay.apiPayLoad.exception.handler.GeneralHandler;
import umc.codeplay.domain.Member;
import umc.codeplay.domain.Music;
import umc.codeplay.repository.MemberRepository;
import umc.codeplay.repository.MusicRepository;
@Service
@RequiredArgsConstructor
public class FileService {
@Value("${s3.bucket}")
private String bucketName;
@Value("${spring.cloud.aws.region.static}")
private String region;
private final S3Presigner s3Presigner;
private final MusicRepository musicRepository;
private final MemberRepository memberRepository;
// 타임스탬프_파일명 형식으로 파일 이름 저장
public static String buildFilename(String filename) {
return String.format("%s_%s", System.currentTimeMillis(), sanitizeFileName(filename));
}
// 특수 문자나 공백 등을 정리
private static String sanitizeFileName(String fileName) {
String normalizedFileName = Normalizer.normalize(fileName, Normalizer.Form.NFC);
System.out.println(normalizedFileName);
return normalizedFileName.replaceAll("\\s+", "_").replaceAll("[^가-힣a-zA-Z0-9.\\-_]", "_");
}
// S3에 파일을 업로드할 수 있는 Presigned URL 생성
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);
}
}
// User 레포지토리에 업로드
public Long uploadProfile(String newFileName, String userEmail) {
Member member =
memberRepository
.findByEmail(userEmail)
.orElseThrow(() -> new GeneralHandler(ErrorStatus.MEMBER_NOT_FOUND));
String s3Url =
String.format("https://%s.s3.%s.amazonaws.com/%s", bucketName, region, newFileName);
member.setProfileUrl(s3Url);
return memberRepository.save(member).getId();
}
// music 레포지토리에 업로드
public Long uploadMusic(String newFileName, String userEmail) {
Member member =
memberRepository
.findByEmail(userEmail)
.orElseThrow(() -> new GeneralHandler(ErrorStatus.MEMBER_NOT_FOUND));
// 저장하는 url은 유효시간이 없는 public
String s3Url =
String.format("https://%s.s3.%s.amazonaws.com/%s", bucketName, region, newFileName);
Music newMusic = Music.builder().title(newFileName).musicUrl(s3Url).member(member).build();
return musicRepository.save(newMusic).getId();
}
}