사진 0장 & @RequestPart(name = "post")
intelliJ 에서는 에러가 발생하지 않았다.
(자동으로 파일이 생성이 되어서 저장이 되었기 때문에)
임의로 1장이 생겨서 저장이 된다.
무조건 사진 1장은 필수이고 3장까지 업로드할 수 있도록 하여했다.
하지만 사진을 넣지 않아도 자동으로 파일이 생긴다. 하지만 이 파일은 파일명 뒤에 파일 형식이 붙지도 않은 0B 파일이다.
URL을 눌렀을 땐 내용이 빈 파일이 뜬다.
1. user.dir 시스템 프로퍼티를 이용해서 홈 디렉토리 경로 설정
2. src/main/resources/images 디렉토리에 저장할 것이므로, 해당 경로를 타겟으로 지정
3. 타켓 경로가 존재하지 않으면 디렉토리 생성
4. 중복 방지를 위해 유니크한 파일명을 생성
5. 해당 파일의 MultipartFile의 바이터 데이터를 기록
MultipartFile에서 File로 convert 하는 메서드가 있다.
public Optional<File> convert(MultipartFile multipartFile) throws IOException {
String homeDirectory = System.getProperty("user.dir");
String targetDirectory = homeDirectory + "/src/main/resources/images/";
File directory = new File(targetDirectory);
if (!directory.exists()) {
directory.mkdirs();
}
// 유니크한 파일명
String uniqueFileName = UUID.randomUUID().toString() + "_" + multipartFile.getOriginalFilename();
File convertFile = new File(targetDirectory + uniqueFileName);
if (convertFile.createNewFile()) {
try (FileOutputStream fileOutputStream = new FileOutputStream(convertFile)) { // fileOutputStream 데이터 -> 바이트 스트림으로 저장
fileOutputStream.write(multipartFile.getBytes());
}
return Optional.of(convertFile);
}
throw new IOException("파일 전환에 실패했습니다: " + multipartFile.getOriginalFilename() + " (경로: " + convertFile.getAbsolutePath() + ")");
}
이 때,
convertFile.createNewFile()
에서 만약 이미지가 0장이 들어오는 경우 임시로 0B인 파일을 생성한다.
이것을 해결하기 위해서는 내가 생각한 방법은 두 가지가 있다.
- 이미지가 0장일 때
convert()
메서드를 호출하지 않아서 자동으로 임시파일이 생성되는 것을 막는다.S3Service
에서는 모두 허용하고PostService
에서0B
이 파일이 있다면Exception
을 발생시킨다.
내가 선택한 방법은
2. S3Service에서는 모두 허용하고 PostService에서 0B이 파일이 있다면 Exception을 발생시킨다.
이다.
if (images == null || images.isEmpty() || images.stream().allMatch(image -> image.isEmpty())) {
throw new IllegalArgumentException("사진을 1장 이상 업로드 해주세요.");
}
나는 "null
"로 해결할 수 있을 줄 알았다.
하지만 여전히 null
만 했을 때는 해결되지 않았다.
그래서 PostService에서 이러한 if문을 만들어주었다.
if (images == null || images.isEmpty() || images.stream().allMatch(image -> image.isEmpty())) {
throw new IllegalArgumentException("사진을 1장 이상 업로드 해주세요.");
}
사실 혹시 몰라서 3가지를 다 넣었다....
하나만 걸려라.....
그리고 어느 조건에서 true
가 돼서 Exception이 발생하는지 찍어보았다.
images == null ➡️ false
images.isEmpty() ➡️ false
images.stream().allMatch(image -> image.isEmpty()) ➡️ true
images == null
:images
변수가null
인 경우 ➡️ 아무 이미지를 전달받지 않은 경우images.isEmpty()
:images
리스트가 비어있는 경우 ➡️ 이미지가 전달되었지만 빈 리스트가 전달된 경우images.stream().allMatch(image -> image.isEmpty())
: 이미지 파일이 비어있는지 확인 ➡️ (0B 확인)
이렇게 해서 자동으로 생성되는 파일(0B 파일)이 업로드가 되지 않도록 하였다.