이미지 업로드 시 주의해야 될 것[AWS S3]

10000DOO·2023년 8월 3일
1

YouHaveTo

목록 보기
12/12
post-thumbnail

🚨 1. 문제 상황

이미지를 ec2내부에 저장하는 방식으로 사용하다가 이번에 s3를 도입하게 되었습니다.
코드를 변경하다가 문제가 발생했습니다.
사진을 저장할 때 파일 이름이 겹치면 s3에 중복되어 올라가지 않는다는 것입니다.

❌ 기존 코드

public List<Media> uploadMediaToFiles(List<MultipartFile> files) throws IOException {
        List<Media> mediaList = new ArrayList<>();

        for (MultipartFile file : files) {
            String originalFilename = file.getOriginalFilename();
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.getSize());
            metadata.setContentType(file.getContentType());
            amazonS3.putObject(bucket, originalFilename, file.getInputStream(), metadata);
            String storeFileName = createStoreFileName(originalFilename);

            Media media = Media.builder()
                    .originalFilename(originalFilename)
                    .filename(storeFileName)
                    .filePath(amazonS3.getUrl(bucket, originalFilename).toString())
                    .dateTime(new DateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")),
                            LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")), null))
                    .build();
            mediaList.add(media);
            mediaRepository.save(media);
            log.info(storeFileName + " 저장되었습니다.");
        }
        return mediaList;
    }

DB에 저장하기 위해 Media 객체를 만들고 있습니다.
originalFilename은 사용자가 지정한 파일의 이름이고 filename은 UUID를 통해 만들어진 고유한 이름입니다.
하지만 amazonS3.putObject(bucket, originalFilename, file.getInputStream(), metadata); 을 보면 filename 대신 originalFilename을 넣는 실수를 했습니다.

🛠️ 수정 코드

public List<Media> uploadMediaToFiles(List<MultipartFile> files) throws IOException {
        List<Media> mediaList = new ArrayList<>();

        for (MultipartFile file : files) {
            String originalFilename = file.getOriginalFilename();
            String storeFileName = createStoreFileName(originalFilename);
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.getSize());
            metadata.setContentType(file.getContentType());
            amazonS3.putObject(bucket, storeFileName, file.getInputStream(), metadata);

            Media media = Media.builder()
                    .originalFilename(originalFilename)
                    .filename(storeFileName)
                    .filePath(amazonS3.getUrl(bucket, storeFileName).toString())
                    .dateTime(new DateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")),
                            LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")), null))
                    .build();
            mediaList.add(media);
            mediaRepository.save(media);
            log.info(storeFileName + " 저장되었습니다.");
        }
        return mediaList;
}

private String createStoreFileName(String originalFilename) {
        String ext = extractExt(originalFilename);
        String uuid = UUID.randomUUID().toString();
        return uuid + "." + ext;
}

private String extractExt(String originalFilename) {
        int pos = originalFilename.lastIndexOf(".");
}

amazonS3.putObject(bucket, storeFileName, file.getInputStream(), metadata);
이렇게 코드를 수정하여 UUID로 설정된 이름으로 업로드하여 중복을 방지했습니다.

profile
iOS 개발자 지망생 https://github.com/10000DOO

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

좋은 정보 감사합니다

답글 달기