반응형

ResponseEntity

ResponseEntity는 View를 제공하지 않는 형태로 요청을 처리하고, 직접 결과 데이터 및 Http 상태 코드를 설정하여 응답을 할 수 있다. 이번 글에서는 이를 활용해서 파일 다운로드를 구현해보겠다.


  • ResourceLoader 사용

    우선 다운로드 할 수 있게끔하려는 파일을 코드상에서 읽어와야한다. (이때 파일은 프로젝트의 resources 폴더에 넣어 주었다.) 여기서는 ResourceLoader를 사용하여 리소스를 읽어와서 다운로드가 가능하게끔 만들겠다.

    Resource resource = resourceLoader.getResource("classpath:" + filename);


  • resource를 File로 저장하기

    뒤에서 나올 내용이지만 해당 파일의 길이를 헤더에 지정해주기 위해서 resource를 File로 읽어 저장해준다.

    File file = resource.getFile()


  • ResponseEntity 사용하기

    ResponseEntity를 사용하기 위해서는 응답 상태 코드, 응답 헤더, 응답 본문을 설정해주어야한다.

    @GetMapping("/file/{filename}")
        public ResponseEntity<Resource> fileDownload(@PathVariable String filename) throws IOException {
            Resource resource = resourceLoader.getResource("classpath:" + filename);
            File file = resource.getFile();
    
              // 파일의 mediaType를 알아내기 위한 api
            Tika tika = new Tika();
            String mediaType = tika.detect(file);
    
            return ResponseEntity.ok()    // ok 200 상태코드 설정
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachement;filename=\"" + resource.getFilename() + "\"")        // 파일이 다운로드 되어 저장될 이름
                    .header(HttpHeaders.CONTENT_TYPE, mediaType)  // 파일의 타입
                    .header(HttpHeaders.CONTENT_LENGTH, file.length() + "")        // 파일의 크기
                    .body(resource);        // 응답 본문
        }
    • ResponseEntity에서 .으로 이어가며 응답 상태코드, 헤더, 본문을 설정해준다.
    • 위에서 Tika를 사용하였는데 mediaType를 알아내기 위한 api이다.
      • 이를 사용하려면 Apache Tika Core를 dependency로 추가를 해주어야한다.

  • 서버 실행 후 파일 다운로드 요청 보내보기

    Screen Shot 2020-01-23 at 5 38 20 PM
    • 위와 같이 요청을 보내면 파일이 다운로드 된다. 단, test.jpeg라는 파일이 resources폴더에 존재해야한다.
    Screen Shot 2020-01-23 at 5 38 26 PM
반응형

BELATED ARTICLES

more