Spring File Upload 구현 과정 / Controller에서 파일 데이터 받아오기
서버 관련 파일 업로드 구현
https://caileb.tistory.com/152
<클라이언트에서 파일 받아오는 3가지 방법>
1) @RequestParam MultipartFile 사용
2) ServletRequest, MultipartHttpServletRequest 사용
3) 사용자 정의 Class 타입
클라이언트는 파일을 요청받을 때 "multipart/form-data"로 세팅해서 요청한다.
여기서도 생략된 RequestParam을 이용해 MultipartFile 객체를 받아오고 있다.
MultipartHttpServletRequest로 타입을 받아오는 경우는
다음과 같이, getFile 함수로 파일을 받아온 다음 처리한다.
ServerUploadController를 만든 다음, 내부 로직들을 ServerUploadService로 넘겨 처리한다.
고민인 점 하나는, Upload처리할 때는 따로 디비에 파일을 저장하지 않는 것으로 안다.
그렇다면 Repository단까지 확장할 필요는 없다고 느껴진다.
Board와 매핑될 File 테이블이 존재해야한다.
Board의 PK와 File의 PK를 참조하는 BoardFile이라는 테이블은 게시판과 그 게시판이 지닌 파일들의 리스트를 저장할 수 있어야 하고, 이로 인해 File은 엔티티로서 디비에 저장되어야하는 것이다.
즉 나는 File과 관련된 정보를 DB에 저장해야하는 셈이다.
@GetMapping("/display")
public ResponseEntity<byte[]> getFile(String fileName){
File file = new File("C:\\upload\\" + fileName);
ResponseEntity<byte[]> result = null;
try {
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", Files.probeContentType(file.toPath()));
result = new ResponseEntity<>(FileCopyUtils.copyToByteArray(file), header, HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
이 코드를 분석하고 Controller와 Service 코드를 분리해보았다.
HttpHeader란?
HTTP 요청과 응답을 대표하는 자료구조이다.
add(String headerName, String headerValue) : 헤더 이름에 대한 값 목록에 헤더 값을 추가한다.
파일 이름을 파라미터로 받아 특정 폴더의 파일을 생성한다.
그리고 Content-Type이라는 헤더에 가공된 filePath를 넣어 반환한 마임 타입을 header Value로 추가한다.
마임 타입은 파일 변환을 위한 포맷이다.
이를 ReponseEntity의 파라미터로 넣어준다.
여기까지