(1). bulid.gradle
에 추가
// ASW S3
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
implementation "com.amazonaws:aws-java-sdk-s3:1.12.281"
(2). application.properties
에 추가
cloud.aws.stack.auto=false
cloud.aws.region.static=ap-northeast-2
cloud.aws.s3.bucket=버킷 이름
cloud.aws.credentials.access-key=엑세스 키
cloud.aws.credentials.secret-key=보안 키
(3). S3Config 클래스 추가
@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 AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey,secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.build();
}
}
(4). S3Uploader 클래스 추가
@RequiredArgsConstructor
@Service
public class S3Uploader {
private final AmazonS3 amazonS3;
@Value("${cloud.aws.s3.bucket}")
private String bucket;
// 파일 형식으로 오는 것 업로드
public String uploadFile(MultipartFile multipartFile) throws IOException {
String fileName = UUID.randomUUID().toString() + "_" + multipartFile.getOriginalFilename();
// if (!fileName.toLowerCase().endsWith(".jpg")) {
// fileName += ".jpg";
// }
ObjectMetadata objMeta = new ObjectMetadata();
objMeta.setContentLength(multipartFile.getSize());
amazonS3.putObject(bucket, fileName, multipartFile.getInputStream(), objMeta);
return amazonS3.getUrl(bucket, fileName).toString();
}
// url 형식으로 오는 것 추가
public String uploadImage(String image){
ObjectMetadata objMeta = new ObjectMetadata();
objMeta.setContentLength(image.length());
amazonS3.putObject(bucket, image, image);
return amazonS3.getUrl(bucket, image).toString();
}
// 파일 삭제
public boolean delete(String fileUrl) {
try {
String[] temp = fileUrl.split("/");
String fileKey = temp[temp.length-1];
amazonS3.deleteObject(bucket, fileKey);
return true;
} catch (Exception e) {
return false;
}
}
}
(5). Controller 적용
~~Mapping
에서 consumes으로 미디어 타입을 명시해준다. 그리고 @ReqeustPart
로 받아준다.@Operation(summary = "마이페이지 수정", description = "마이페이지 수정하는 메서드입니다.")
@PutMapping(value = "/mypage",
consumes = {MediaType.MULTIPART_FORM_DATA_VALUE,MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<Message> profileUpdate(@RequestPart("imageFile")MultipartFile image,
@RequestPart ProfileRequestDto profileRequestDto,
@AuthenticationPrincipal UserDetailsImpl userDetails) throws IOException {
return memberService.profileUpdate(image, profileRequestDto, userDetails.getMember());
}
(6). Service
서비스 딴에는 S3Uploader 클래스에 있는 메서드를 이용해 값들을 넣어준다.