복붙노트

[SPRING] Spring MVC의 ResponseEntity로 스트림 리턴하기

SPRING

Spring MVC의 ResponseEntity로 스트림 리턴하기

ResponseEntity를 반환하는 Spring MVC 메서드가 있습니다. 검색된 특정 데이터에 따라 때때로 사용자에게 데이터 스트림을 반환해야합니다. 다른 경우에는 스트림이 아닌 다른 것을 반환하고 때로는 리디렉션을 반환합니다. 나는 이것이 스트림이 될 것이고 바이트 배열이 아닌 큰 배열이되기를 바랄 것이다.

현재 다음 코드 스 니펫을 사용하여 스트림을 반환합니다.

HttpHeaders httpHeaders = createHttpHeaders();
IOUtils.copy(inputStream, httpServletResponse.getOutputStream());

return new ResponseEntity(httpHeaders, HttpStatus.OK);

아쉽게도 이것은 Spring HttpHeaders 데이터가 응답에서 실제로 HTTP 헤더를 채우는 것을 허용하지 않습니다. Spring이 ResponseEntity를 받기 전에 내 코드가 OutputStream에 쓴 이후로는 의미가있다.

어떻게 든 Spring이 그것을 처리하게 해주는 InputStream을 가진 ResponseEntity를 리턴하는 것은 매우 좋을 것입니다. 또한 ResponseEntity를 성공적으로 반환 할 수있는 내 함수의 다른 경로와도 유사합니다. 어쨌든 스프링으로 이것을 할 수 있습니까?

또한, 나는 Spring이 그것을 받아들이는지를보기 위해 ResponseEntity에서 InputStream을 리턴하려고 시도했다.

return new ResponseEntity(inputStream, httpHeaders, HttpStatus.OK);

하지만이 예외가 throw됩니다.

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

HttpServletResponse에서 직접 모든 것을 설정하여 작업 할 수있는 함수를 얻을 수 있지만 Spring에서만이 작업을 수행하려고합니다.

해결법

  1. ==============================

    1.Spring의 InputStreamResource는 잘 작동한다. Content-Length를 수동으로 설정해야합니다. 그렇지 않으면 Spring이 Content-Length를 얻기 위해 스트림을 읽으려고합니다.

    Spring의 InputStreamResource는 잘 작동한다. Content-Length를 수동으로 설정해야합니다. 그렇지 않으면 Spring이 Content-Length를 얻기 위해 스트림을 읽으려고합니다.

    InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
    httpHeaders.setContentLength(contentLengthOfStream);
    return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);
    

    나는이 클래스를 사용하여 제안하는 웹 페이지를 찾지 못했습니다. ByteArrayResource를 사용하기위한 몇 가지 제안이 있음을 알았 기 때문에 나는 짐작 만했습니다.

  2. from https://stackoverflow.com/questions/20333394/return-a-stream-with-spring-mvcs-responseentity by cc-by-sa and MIT license