@RequestPart MultipartFile multipartFile
이 한줄로 간단하게 해결 할 수 있다.
@ApiOperation(value = "프로필 사진 등록")
@PostMapping("/profileimage")
public ResponseEntity<String> registerProfileImage(@RequestParam Long id, @RequestPart MultipartFile multipartFile) {
}
@PostMapping을 활용해서 클라이언트의 이미지 Request를 받아본다.
@RequestParam으로는 프로필 사진을 저장할 멤버의 키값을 받아온다.
Date date = new Date();
StringBuilder sb = new StringBuilder();
Member member = new Member();
Date는 일명이 겹치는것을 방지 하기 위해 파일명에 시간변수를 추가 하기 위해 선언했고
StringBuilder는 파일명 생성을 위해 선언했고
@Entity로 선언된 Member는 Entity를 업데이트 하기위해 선언했다.
if(multipartFile.isEmpty()) {
sb.append("none");
} else {
sb.append(date.getTime());
sb.append(multipartFile.getOriginalFilename());
}
request된 파일의 존재여부를 확인하고 스트링빌더에 문자열을 추가한다.
if(!multipartFile.isEmpty()) {
}
request된 파일이 존재한다면
File dest = new File("C://images/profile/" + sb.toString());
파일을 생성한다.
try {
}
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
그후 try ~ catch문을 선언하고 try문 안에
member = memberService.findbyId(id);
if(member.getImageAddress() == null) {
member.setImageAddress("C://images/profile/" + sb.toString());
memberService.updateImageAddress(member);
multipartFile.transferTo(dest);
} else {
File file = new File(member.getImageAddress());
if(file.exists()) {
file.delete();
}
member.setImageAddress("C://images/profile/" + sb.toString()); // 새로운 이미지 주소 DB에 저장
memberService.updateImageAddress(member); // Entity 업데이트
multipartFile.transferTo(dest); // 파일 저장
}
memberService를 호출해서 id를 인자로 넘겨주고 id에 해당하는 Entity를 가져온다. 그 후 객체안에 이미지 주소가
Null값이라면
(기존에 이미 프로필 사진을 올린 적이 한번이라도 없다면) 이미지 주소를 객체에 설정하고 업데이트를 진행 후 서버 로컬에 파일 저장을 진행한다.
Null값이 아니라면
기존에 저장된 파일 경로를 DB에서 가져온 다음 파일 인스턴스 생성할때 path값으로 넣어서 file인스턴스를 생성한다.
path를 따라갔을때 그 file이 존재한다면 삭제를 하고
새로운 이미지 파일명을 객체에 저장을 하고 DB에 업데이트를 한 후에 해당하는 서버 로컬주소에 사진을 저장한다.
위와 같은 방법으로 사진 업로드를 진행하면 간단하게 마무리 지을 수 있다!