MultiPartFile (SpringBoot)

권혁진·2022년 4월 29일
0

서버와 클라이언트의 이미지 전송은 어떤 식으로 할까?

@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에 업데이트를 한 후에 해당하는 서버 로컬주소에 사진을 저장한다.

위와 같은 방법으로 사진 업로드를 진행하면 간단하게 마무리 지을 수 있다!

profile
성장하는 개발자

0개의 댓글