sm 기술 블로그

REST API로 버킷에 파일 업로드 (SpringBoot 이용) 본문

AWS

REST API로 버킷에 파일 업로드 (SpringBoot 이용)

sm_hope 2022. 10. 22. 20:11

특정 URL로 들어가면 파일이 업로드 되게 만들어 보자.

 

1. application.yml 수정

cloud:
  aws:
    credentials:
      accessKey: 발급받은 엑세스 키
      secretKey: 발급받은 엑세스 비밀키
    s3:
      bucket: 작성한 버킷이름
      dir: /
    region:
      static: ap-northeast-2
    stack:
      auto: false

!!! cloud 최상위이다.

 

버킷만들기 : https://smhope.tistory.com/588?category=1092398 

사용자 만들기 : https://smhope.tistory.com/589?category=1092398 

 

위 두 단계에서 만든 내용을 위에 yml에 작성해준다.

 

2. Gradle 추가

implementation 'com.amazonaws:aws-java-sdk-s3:1.12.316'

 

3. AwsConfig 작성

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AwsConfig {
    @Value("${cloud.aws.credentials.accessKey}")
    private String accessKey;

    @Value("${cloud.aws.credentials.secretKey}")
    private String secretKey;

    @Value("${cloud.aws.region.static}")
    private String region;

    @Bean
    public AmazonS3 amazonS3() {
        AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .build();
    }
}

 

 

4. Controller 작성

    @PostMapping("/awsUploadTest")
    public void awsUploadTest(@RequestParam("files") List<MultipartFile> files) throws IOException {
        talkService.awsFileUpload(files);
    }

에러가 발생할 수 있으므로 에러처리를 사용하자.

 

5. Service 작성

import org.springframework.beans.factory.annotation.Value;

... 생략 ...

    @Value("${cloud.aws.s3.bucket}")
    private String bucket;

    private final AmazonS3 amazonS3;

... 생략 ...

    public void awsFileUpload(List<MultipartFile> files) throws IOException {
        files.stream()
                .forEach(file-> {
                    String s3FileName = String.valueOf(UUID.randomUUID());
                    ObjectMetadata objectMetadata = new ObjectMetadata();
                    try{
                        objectMetadata.setContentLength(file.getInputStream().available());
                        amazonS3.putObject(bucket, s3FileName, file.getInputStream(), objectMetadata);
                    }catch (IOException e){
                        throw new RuntimeException(e);
                    }
                });

    }
   
... 생략 ...

랜덤이름으로 파일을 버킷에 저장하는 과정이다.

여기서 주의할점은 Value는 bean이다 lombok 아니다.

만약 적용이 안되면 천천히 다시 해보자.

 

 

참고로 value어노테이션에 있는 값들은 1번 application에서 작성한 값들이다.

 

 

다음과 같이 postman에서 REST API를 실행해 보면  정상적으로 작동하고

(KEY는 text형식이 아닌 file형식)

다음과 같이 s3 버킷에 파일이 정상적으로 들어간것을 볼 수 있다.

 

 

 

https://github.com/denist2322/smChatting/tree/master/sm_chatting_back

 

GitHub - denist2322/smChatting

Contribute to denist2322/smChatting development by creating an account on GitHub.

github.com

yml은 보안상 업로드하지 않았다.

'AWS' 카테고리의 다른 글

EC2에 파일 전송  (0) 2022.10.23
EC2 Putty로 접속  (0) 2022.10.22
EC2 만들기 (인스턴스) - ubuntu  (0) 2022.10.22
사용자 만들기 (iam)  (0) 2022.10.22
버킷 만들기 (이미지, 동영상등을 저장)  (0) 2022.10.22
Comments