스프링 웹 MVC-23.ResponseEntity(핸들러 메소드)


핸들러 메소드 14부: ResponseEntity

파일 리소스를 읽어오는 방법

  • 스프링 ResourceLoader 사용하기

파일 다운로드 응답 헤더에 설정할 내용

  • Content-Disposition: 사용자가 해당 파일을 받을 때 사용할 파일 이름
  • Content-Type: 어떤 파일인가
  • Content-Length: 얼마나 큰 파일인가

파일의 종류(미디어 타입) 알아내는 방법

  • http://tika.apache.org/

ResponseEntity

  • 응답 상태 코드
  • 응답 헤더
  • 응답 본문

tika-core 라이브러리

        <!-- https://mvnrepository.com/artifact/org.apache.tika/tika-core -->
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>1.23</version>
        </dependency>
    @Autowired
    private ResourceLoader resourceLoader;

    // @ResponseBody
    // Resurce 로 리턴하는 경우
    
    @GetMapping("/file/{filename}")
    // @ResponseBody 안써도 됨. ResponseEntity 자체가 응답이기 때문
    public ResponseEntity<Resource> fileDownload(@PathVariable String filename) throws IOException {
        System.out.println(filename);
        Resource resource = resourceLoader.getResource("classpath:" + filename);
        File file = resource.getFile();

        Tika tika = new Tika(); // 빈 등록해서 사용
        String mediaType = tika.detect(file);
        System.out.println("mediaType : " + mediaType);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+resource.getFilename())
                //.header(HttpHeaders.CONTENT_TYPE, "image/jpg") // 미디어타입을 알아야 하니까 라이브러리 사용
                .header(HttpHeaders.CONTENT_TYPE, mediaType)
                .header(HttpHeaders.CONTENT_LENGTH, file.length() + "")
                .body(resource);
    }

참고 https://spring.io/guides/gs/uploading-files/ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition https://www.baeldung.com/java-file-mime-type




© 2019. by jaeuk