@RequestMapping(value = "/downloadFile/{fileId}",
method = RequestMethod.GET)
-> @RequestMapping 어노테이션은 이 메소드가 어떤 HTTP 요청을 처리할 것인지를 정의.
여기서는 "/downloadFile/{fileId}" 패턴의 GET 요청을 처리하도록 설정되어 있음.
{fileId}는 경로 변수(Path Variable)로, 실제 요청 URL에서 이 부분은 실제 파일 ID로 대체됨.
public void downloadFile(@PathVariable String fileId,
HttpServletResponse response)
throws IOException
-> 이 부분은 downloadFile라는 메소드를 정의하는 부분.
이 메소드는 두 개의 파라미터를 받음.
@PathVariable String fileId는 @PathVariable 어노테이션을 통해
URL의 {fileId} 부분을 fileId라는 String 변수로 받아옴.
HttpServletResponse response는 HTTP 응답을 작성하기 위한 객체.
GridFSFile file = boardService.getFile(fileId);
-> boardService.getFile(fileId) 메소드는 파일 ID를 통해 해당 파일의 정보를 MongoDB에서 가져옴.
가져온 정보는 GridFSFile 객체로 반환되며, 이는 MongoDB의 GridFS 시스템에서 사용하는 파일 모델.
if (file == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
-> 만약 MongoDB에서 해당 ID의 파일을 찾지 못해 file이 null이라면,
HTTP 응답 상태 코드를 404(Not Found)로 설정하고 메소드를 종료.
response.setContentType(file.getContentType());
response.setHeader("Content-Disposition",
"attachment; filename=" + file.getFilename());
-> 이 부분은 HTTP 응답의 헤더를 설정하는 부분.
Content-Type 헤더는 해당 응답의 미디어 타입(MIME 타입)을 나타냄.
Content-Disposition 헤더는 해당 응답이 파일 다운로드임을 나타내고, 다운로드될 파일의 이름을 설정함.
IOUtils.copy(gridFsTemplate.getResource
(file.getFilename()).getInputStream(), response.getOutputStream());
-> 이 부분은 실제 파일의 내용을 HTTP 응답의 본문에 쓰는 부분.
gridFsTemplate.getResource(file.getFilename()).getInputStream()은
MongoDB의 GridFS에서 해당 파일의 내용을 읽어오는 InputStream을 가져옴.
response.getOutputStream()은 HTTP 응답의 본문에 쓰기 위한 OutputStream을 가져옴.
IOUtils.copy() 메소드는 InputStream으로부터 읽어온 데이터를 OutputStream에 쓰는 역할을 함.
즉, 이 부분은 MongoDB에서 읽어온 파일의 내용을 HTTP 응답에 쓰는 역할.
이렇게 downloadFile 메소드는 클라이언트의 파일 다운로드 요청을 처리하여,
해당 파일의 정보를 HTTP 응답으로 반환하며,
실제 파일의 내용은 HTTP 응답의 본문에 기록하여 반환함.
이로써, 클라이언트는 이 HTTP 응답을 파일 다운로드로 처리하게 됨.
아래 전체 코드
@RequestMapping(value = "/downloadFile/{fileId}", method = RequestMethod.GET)
public void downloadFile(@PathVariable String fileId, HttpServletResponse response) throws IOException {
GridFSFile file = boardService.getFile(fileId);
if (file == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
response.setContentType(file.getContentType());
response.setHeader("Content-Disposition", "attachment; filename=" + file.getFilename());
try {
IOUtils.copy(gridFsTemplate.getResource(file.getFilename()).getInputStream(), response.getOutputStream());
} catch (IOException e) {
throw new RuntimeException("File streaming failed", e);
}
}
}