동-훈
도전하는 개발자
동-훈
전체 방문자
오늘
어제
  • 분류 전체보기 (10)
    • spring boot (0)
    • 언어 (0)
      • Java (0)
    • git (1)
    • DevOps (4)
      • aws (3)
      • 기타 (1)
    • 알고리즘 (0)
      • 백준 (0)
      • 프로그래머스 (0)
    • 후기 (4)
      • 프로젝트 (3)
      • 대회 (1)
    • 주절주절 (1)

블로그 메뉴

  • 🐰GITHUB
  • ☘️포트폴리오
  • 🌸홈

공지사항

인기 글

태그

  • gitignore
  • EC2
  • taskkill
  • 해커톤
  • 프론트 백엔드 협업
  • S3
  • Spring Boot 배포
  • 8080 포트 에러
  • gitignore 에러
  • netstat
  • 팀프로젝트
  • RDS
  • mysql

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
동-훈

도전하는 개발자

DevOps/aws

[Spring Boot] AWS S3로 파일 저장소 연동하기

2022. 10. 24. 22:08

build.gradle

implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

 

application.properties

cloud.aws.region.static=ap-northeast-2
cloud.aws.stack.auto=false
cloud.aws.s3.bucket=
cloud.aws.credentials.access-key=
cloud.aws.credentials.secret-key=

spring.servlet.multipart.max-file-size: 10MB
spring.servlet.multipart.max-request-size: 10MB

 

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();
    }
}

 

S3Uploader

@Component
@RequiredArgsConstructor
public class S3Uploader {
    private final AmazonS3Client amazonS3Client;
    @Value("${cloud.aws.s3.bucket}")
    private String bucket;

    public String uploadFiles(MultipartFile multipartFile, String dirName) throws IOException {
        File uploadFile = convert(multipartFile)  // 파일 변환할 수 없으면 에러
                .orElseThrow(() -> new IllegalArgumentException("error: MultipartFile -> File convert fail"));
        return upload(uploadFile, dirName);
    }

    public String upload(File uploadFile, String filePath) {
        String fileName = filePath + "/" + UUID.randomUUID() + uploadFile.getName();   // S3에 저장된 파일 이름
        String uploadImageUrl = putS3(uploadFile, fileName); // s3로 업로드
        removeNewFile(uploadFile);
        return uploadImageUrl;
    }

    // S3로 업로드
    private String putS3(File uploadFile, String fileName) {
        amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, uploadFile).withCannedAcl(CannedAccessControlList.PublicRead));
        return amazonS3Client.getUrl(bucket, fileName).toString();
    }

    // 로컬에 저장된 이미지 지우기
    private void removeNewFile(File targetFile) {
        if (targetFile.delete()) {
            System.out.println("File delete success");
            return;
        }
        System.out.println("File delete fail");
    }

    // 로컬에 파일 업로드 하기
    private Optional<File> convert(MultipartFile file) throws IOException {
        File convertFile = new File(System.getProperty("user.dir") + "/" + file.getOriginalFilename());
        if (convertFile.createNewFile()) { // 바로 위에서 지정한 경로에 File이 생성됨 (경로가 잘못되었다면 생성 불가능)
            try (FileOutputStream fos = new FileOutputStream(convertFile)) { // FileOutputStream 데이터를 파일에 바이트 스트림으로 저장하기 위함
                fos.write(file.getBytes());
            }
            return Optional.of(convertFile);
        }
        return Optional.empty();
    }
}

 

 

PostController

@RestController
@RequiredArgsConstructor
public class PostController {

    private final S3Uploader s3Uploader;

    @PostMapping("/post")
    public String postImg (@RequestPart(value = "img") MultipartFile multipartFile) throws IOException {
        
        
        return s3Uploader.uploadFiles(multipartFile, "버킷 폴더이름");
    }
}
저작자표시 비영리 변경금지 (새창열림)

'DevOps > aws' 카테고리의 다른 글

[Spring Boot] AWS에 프로젝트 배포하기(EC2, FileZilla)  (0) 2022.10.10
[Spring Boot] AWS에 프로젝트 배포하기 - RDS Mysql 세팅하기  (1) 2022.10.10
    'DevOps/aws' 카테고리의 다른 글
    • [Spring Boot] AWS에 프로젝트 배포하기(EC2, FileZilla)
    • [Spring Boot] AWS에 프로젝트 배포하기 - RDS Mysql 세팅하기
    동-훈
    동-훈

    티스토리툴바