이미지를 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로 설정된 이름으로 업로드하여 중복을 방지했습니다.
좋은 정보 감사합니다