Spring boot에서 AWS S3 파일업로드 하는 방법이다.
Spring boot AWS 배포 방법
2018/10/26 - [Develop/Spring Boot] - Spring Boot AWS Elastic BeanStalk을 이용한 배포
AWS Python Lambda 사용방법
2018/11/16 - [Develop/Python] - AWS Python Lambda (CloudWatch Lambda) 사용하기
1. S3에서 버킷을 하나 생성한다.
버킷을 생성할 때 주의할 점은 이름에 대문자가 들어가면 안되고 특수문자가 들어가면안된다. 또한, 이 버킷의 이름은 AWS S3의 전체 버킷 이름들과 중복이 되면 안된다. 예를들어 test라는 버킷을 한 경우 누군가 test라는 버킷을 사용중이라면 test라는 이름으로 버킷을 생성할 수 없다.
이름을 정한 후 옵션이나 권한 설정은 필요하면 설정을 하시고 그 외 그냥 다음을 눌러 생성한다. 어차피 옵션이나 권한은 S3를 생성하고 다시 설정을 할 수 있다.
2. Spring boot pom.xml에 dependency를 추가한다.
s3 dependency를 추가한다.
com.amazonaws
aws-java-sdk-s3
1.11.452
그리고 Multipartfile 을 사용할 것이기 때문에 Multipartfile dependency를 추가한다.
commons-fileupload
commons-fileupload
1.3.3
3. appliaction.properties 파일 설정.
리전 정보는 옆의 링크에서 확인할 수 있다.- https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html
cloud.aws.credentials.accessKey=IAM USER에서 확인
cloud.aws.credentials.secretKey=IAM USER에서 확인
cloud.aws.s3.bucket=buckettestgogo
cloud.aws.region.static=ap-northeast-2
추가로 Mutlipartfile의 파일 크기 범위를 정하고 싶으면 application.properties에 아래와 같이 추가한다.
spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB
4. 파일업로드
AmazonS3 의존성을 주입하고. bucket이름을 가져온다 굳이 @Value로 안가져와도 되고 buckettestgogo를 선언해도 된다.
ObjectMetadata를 통해 ContentType을 설정할 수 있다.
그리고 CloudFront를 사용하시는 분들이라면 metadata에 setCacheControl로 Cache설정이 가능하다.
또한. 파일의 권한을 지정할 수 있다. 아래 소스에는 읽기를 Public으로 설정하였다.
@Autowired
private AmazonS3 amazonS3;
@Value("${cloud.aws.s3.bucket}")
private String bucket;
public void s3Test(MultipartFile file, String fname) {
TransferManager tm = TransferManagerBuilder.standard().withS3Client(amazonS3).build();
PutObjectRequest request;
try {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setCacheControl("604800"); // 60*60*24*7 일주일
metadata.setContentType("image/png");
request = new PutObjectRequest(bucket, fname, file.getInputStream(), metadata)
.withCannedAcl(CannedAccessControlList.PublicRead);
// amazonS3.putObject(request);
Upload upload = tm.upload(request);
upload.waitForCompletion();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AmazonServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AmazonClientException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
기본적인 예제를 활용하여 만들어 보았다 그 외에는 AWS에서 상세히 잘 설명되어 있다.
AWS 객체업로드 - https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/HLuploadFileJava.html
AWS 리전정보 - https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html