첨부파일을 AWS S3에 업로드
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
@Configuration
public class S3Config {
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;
@Value("${cloud.aws.region.static}")
private String region;
@Bean
public S3Client s3Client() {
return S3Client.builder()
.credentialsProvider(
StaticCredentialsProvider.create(
AwsBasicCredentials.create(accessKey, secretKey)))
.region(Region.of(region))
.build();
}
}
import java.io.IOException;
import java.util.UUID;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
@Service
public class FileUploadService {
private final S3Client s3Client;
private final String bucketName = "spring-trello-project-team-spring"; // S3 버킷 이름
public FileUploadService(S3Client s3Client) {
this.s3Client = s3Client;
}
public String uploadFile(MultipartFile file) throws IOException {
// 파일 검증 (크기와 형식)
validateFile(file);
// 고유한 파일 이름 생성
String fileName = generateFileName(file);
try {
// S3에 파일 업로드
s3Client.putObject(
PutObjectRequest.builder().bucket(bucketName).key(fileName).build(),
RequestBody.fromInputStream(
file.getInputStream(), file.getSize()) // InputStream을 RequestBody로 변환
);
} catch (S3Exception e) {
throw new IllegalStateException("Failed to upload the file to S3", e);
}
return fileName;
}
// 파일 검증 로직
private void validateFile(MultipartFile file) {
if (file.isEmpty()) {
throw new IllegalArgumentException("파일이 비어 있습니다.");
}
// 파일 크기 제한 (5MB 이하)
if (file.getSize() > 5 * 1024 * 1024) { // 5MB 제한
throw new IllegalArgumentException("파일 크기는 최대 5MB입니다.");
}
// 지원되는 MIME 타입 목록
String contentType = file.getContentType();
if (!isSupportedContentType(contentType)) {
throw new IllegalArgumentException("지원되지 않는 파일 형식입니다.");
}
}
// 지원되는 파일 형식 확인
private boolean isSupportedContentType(String contentType) {
return contentType.equals("image/jpeg")
|| contentType.equals("image/png")
|| contentType.equals("application/pdf")
|| contentType.equals("text/csv");
}
// 고유한 파일 이름 생성
private String generateFileName(MultipartFile file) {
return UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
}
}
* AWS S3 자체의 사이즈 제한 때문에 1MB 이하만 업로드됨
업로드 사이즈 제한 변경할것...
'TIL' 카테고리의 다른 글
SpringBoot에서 첨부파일 처리하기 AWS S3 (0) | 2024.10.18 |
---|---|
QueryDSL (0) | 2024.10.17 |
git repository commit 기록 전부 삭제 (0) | 2024.10.11 |
면접피드백 (1) | 2024.10.10 |
Fetch Join (0) | 2024.10.08 |