[TIL] 230808 S3 여러 장 이미지 업로드하기 - 로컬만 성공

CountryGirl·2023년 8월 8일
0

TIL

목록 보기
37/80

여러 블로그와 GitHub를 참고했던 것 같다.


📁 S3

아주 기본적인 CRUD에 사진만 추가하였다.
일단 CRUD가 되면 User를 연결할 것이다.

1. dependency 추가

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

2. AmazonS3Config.java 추가

package com.sparta.actionboss.global.config;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
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 AmazonS3Config {

    @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 awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        return (AmazonS3Client) AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .build();
    }
}

AmazonS3Config.java 이렇게 공통적으로 쓰는 것 같았다.

Amazon S3 클라이언트 설정을 하는 코드


코드 설명

BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);        

AWS 인증에 필요한 기본 정보 객체 만들어준다.

return (AmazonS3Client) AmazonS3ClientBuilder.standard() // Amazon S3 클라이언트 빌더 생성
                .withRegion(region) // 지역 설정
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))	// 인증 정보 설정
                .build();	// 객체 생성

S3Uploader

@Slf4j
@RequiredArgsConstructor
@Service
public class S3Uploader {

    private final AmazonS3Client amazonS3Client;

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


    /*
    - MultipartFile 객체를 해당 디렉토리(dirName)에 파일을 업로드
    - MultipartFile -> File 변환한 후, upload(File uploadFile, String dirName) 메서드에서 실제로 업로드 수행
    */
    public String upload(MultipartFile multipartFile, String dirName) throws IOException {
        File uploadFile = convert(multipartFile).orElseThrow(() -> new IllegalArgumentException("파일 전환에 실패했습니다."));
        return upload(uploadFile, dirName);
    }
    
    
    /*
    - S3에 파일 업로드
    - 중복 방지를 위해 파일명에 UUID를 붙여서 업로드
    */
    private String upload(File uploadFile, String dirName) {
        String s3FileName = dirName + "/" + UUID.randomUUID() + "/" + uploadFile.getName();
        String uploadImageURL = putS3(uploadFile, s3FileName);
        uploadFile.delete();    // 로컬에 저장된 이미지 삭제
        return uploadImageURL;
    }
	
    
    /*
    - AmazonS3Client를 이용해서 파일을 업로드하고 해당 파일의 URL 반환
    */
    private String putS3(File uploadFile, String s3FileName) {
        amazonS3Client.putObject(new PutObjectRequest(s3Bucket, s3FileName, uploadFile).withCannedAcl(CannedAccessControlList.PublicRead));
        return amazonS3Client.getUrl(s3Bucket, s3FileName).toString();
    }
    
    
    /*
    - MultipartFile -> File 변환
    - 시스템 사용자의 홈 디렉토리를 기준으로 파일 경로 설정
    */
    public Optional<File> convert(MultipartFile multipartFile) throws IOException {
        File convertFile = new File(System.getProperty("user.dir") + "/" + multipartFile.getOriginalFilename());
        if (convertFile.createNewFile()) {
            try (FileOutputStream fileOutputStream = new FileOutputStream(convertFile)) { // fileOutputStream 데이터 -> 바이트 스트림으로 저장
                fileOutputStream.write(multipartFile.getBytes());
            }
            return Optional.of(convertFile);
        }
        return Optional.empty();
    }

너무 어렵다

profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글