이 코드는 클라이언트가 특정 파일을 다운로드 요청할 때,
서버가 해당 파일을 찾아 클라이언트에게 반환하는 기능을 수행.
@ResponseBody
-> 이 어노테이션은 메소드가 반환하는 값을 HTTP 응답 본문으로 사용하도록 지시함.
public ResponseEntity<Resource> downloadFile(@PathVariable String fileId, HttpServletResponse response)
-> 이 메소드는 클라이언트의 다운로드 요청을 처리함.
@PathVariable String fileId
-> 이 부분은 URL의 {fileId} 부분을 메소드의 fileId 파라미터로 바인딩함.
GridFSFile file = boardService.getFile(fileId);
-> 이 줄은 boardService의 getFile() 메소드를 호출하여 요청된 파일의 정보를 가져옴.
GridFSFile은 MongoDB의 GridFS에서 사용하는 파일 표현 형식임.
if (file == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
-> 이 부분은 요청된 파일이 없을 경우 404 Not Found 상태 코드를 반환함.
response.setContentType(file.getContentType());
-> 이 줄은 HTTP 응답 헤더의 "Content-Type"을 설정함.
이 헤더는 클라이언트에게 반환하는 파일의 MIME 타입을 나타냄.
response.setHeader("Content-Disposition", "attachment; filename=" + file.getFilename());
-> 이 줄은 HTTP 응답 헤더의 "Content-Disposition"을 설정함.
이 헤더는 클라이언트가 파일을 다운로드할 때 사용할 파일 이름을 지정함.
Resource resource = gridFsTemplate.getResource(file.getFilename());
이 줄은 gridFsTemplate의 getResource() 메소드를 호출하여 요청된 파일의 내용을 가져옴.
Resource는 Spring Framework에서 제공하는 인터페이스로, 실제 파일의 내용을 포함.
return ResponseEntity.ok()...
-> 이 부분은 ResponseEntity를 생성하여 반환.
ResponseEntity는 HTTP 응답 전체(상태 코드, 헤더, 본문)를 표현하는 클래스.
이 코드에서는 상태 코드를 200 OK로 설정하고,
"Content-Type"과 "Content-Disposition" 헤더를 설정하며,
HTTP 응답 본문으로 파일의 내용을 설정함.
따라서, 이 코드는 클라이언트의 다운로드 요청을 받으면,
요청된 파일의 정보와 내용을 찾아 HTTP 응답으로 반환하는 기능을 수행함.
아래 전체코드
@RequestMapping(value = "/downloadFile/{fileId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Resource> downloadFile(@PathVariable String fileId, HttpServletResponse response){
GridFSFile file = boardService.getFile(fileId);
if (file == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
response.setContentType(file.getContentType());
response.setHeader("Content-Disposition", "attachment; filename=" + file.getFilename());
Resource resource = gridFsTemplate.getResource(file.getFilename());
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(file.getContentType()))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"")
.body(resource);
}
수정!!!!
따라서 ResponseEntity에서 동일한 헤더를 설정하고 있다면, 이전에 HttpServletResponse에 설정한 헤더는 사실상 필요 없음.
HttpServletResponse를 메소드 파라미터에서 제거하고, HttpServletResponse를 설정하는 두 줄을 삭제.
대신, ResponseEntity에서 "Content-Type"과 "Content-Disposition" 헤더를 설정함.
이렇게 하면 동일한 기능을 수행하면서 코드가 더 간결해짐
아래 수정코드
@RequestMapping(value = "/downloadFile/{fileId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Resource> downloadFile(@PathVariable String fileId){
GridFSFile file = boardService.getFile(fileId);
if (file == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
Resource resource = gridFsTemplate.getResource(file.getFilename());
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(file.getContentType()))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"")
.body(resource);
}