티스토리 뷰
DB에 업로드
전에 만든 ImageService클래스안에 사진업로드 맨 아래 코드 추가
Image image = imageUploadDto.toEntity(imageFileName,principalDetails.getUser());
Image imageEntity = imageRepository.save(image);
imageUploadDto를 받아서 Image형태로 만들기위해 UUID와 파일의 이름을
합친 imageFileName(Image클래스에 postImageUrl이 될것)과 세션에 저장된 유저를 매개변수로 넣어줍니다
ImageUploadDto
package com.cos.photogramstart.web.dto.image;
@Data
public class ImageUploadDto {
private MultipartFile file;
private String caption;
public Image toEntity(String postImageUrl,User user) {
return Image.builder()
.caption(caption)
.postImageUrl(postImageUrl)
.user(user)
.build();
}
}
받아온 파일이름과 업로드한 유저를 받아와 build를 하여 반환
확인을 할려면 service에서 sysout을 하여 imageEntity를 넣은뒤 업로드해보면 거기에 유저에 대한정보와 사진에 대한 정보가 잘 나온다면 성공이다.
예외처리
@PostMapping("/image")
public String imageUpload(ImageUploadDto imageUploadDto, @AuthenticationPrincipal PrincipalDetails principalDetails){
if(imageUploadDto.getFile().isEmpty()) {
throw new CustomValidationException("이미지가 첨부되지 않았습니다.", null);
}
imageService.사진업로드(imageUploadDto, principalDetails);
return "redirect:/user/"+principalDetails.getUser().getId();
}
if문을 걸어 만약 파일이 비어있다면 위와같이 예외를 발생시킨다
회원가입할때 처럼 Dto에 @NotBlank걸면 안되나요?
네 MultipartFile에는 @NotBlank가 인식이 안됩니다 그렇기 때문에 위와 같이 예외처리를 해주셔야합니다.
CustomValidationException을 밑과 같이 수정
@ExceptionHandler(CustomValidationException.class)
public String validationException(CustomValidationException e) {
if(e.getErrorMap() == null) {
return Script.back(e.getMessage());
}else {
return Script.back(e.getErrorMap().toString());
}
}
원래는 else문에 map을 string화하여 반환하였지만 파일업로드에 exception은 메시지만 매개변수로 넣었으니 에러가 나게된다 그리하여 파일업로드 같이 메시지만 전달하는 예외처리는 위와같이 map이 비었을경우 메시지만 전달하구 스크립트 문을 실행시켜준다.