반응형


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를 추가한다.

1
2
3
4
5
6
<dependency>
    <groupid>com.amazonaws</groupid>
    <artifactid>aws-java-sdk-s3</artifactid>
    <version>1.11.452</version>
</dependency>


그리고 Multipartfile 을 사용할 것이기 때문에 Multipartfile dependency를 추가한다.

1
2
3
4
5
6
<dependency>
    <groupid>commons-fileupload</groupid>
    <artifactid>commons-fileupload</artifactid>
    <version>1.3.3</version>
</dependency>


3. appliaction.properties 파일 설정.


리전 정보는 옆의 링크에서 확인할 수 있다.- https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html 

1
2
3
4
cloud.aws.credentials.accessKey=IAM USER에서 확인
cloud.aws.credentials.secretKey=IAM USER에서 확인
cloud.aws.s3.bucket=buckettestgogo
cloud.aws.region.static=ap-northeast-2<p></p>

추가로 Mutlipartfile의 파일 크기 범위를 정하고 싶으면 application.properties에 아래와 같이 추가한다.


1
2
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으로 설정하였다.

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
@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

반응형

+ Recent posts