파일 다운로드(mongoDB)-ResponseEntity 사용

Hanbyul·2023년 11월 24일

Java

목록 보기
13/23
이 코드는 클라이언트가 특정 파일을 다운로드 요청할 때, 
서버가 해당 파일을 찾아 클라이언트에게 반환하는 기능을 수행.

@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);
    }
profile
공부공부

0개의 댓글