使用 Spring MVC 的 ResponseEntity 返回流

2022-08-31 13:19:07

我有一个弹簧MVC方法,它返回一个.根据检索到的特定数据,它有时需要向用户返回数据流。其他时候,它将返回流以外的内容,有时还会返回重定向。我绝对希望这是一个流,而不是一个字节数组,因为它可能很大。ResponseEntity

目前,我使用以下代码段返回流:

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

return new ResponseEntity(httpHeaders, HttpStatus.OK);

不幸的是,这不允许Spring数据实际填充响应中的HTTP标头。这是有道理的,因为我的代码在Spring收到.HttpHeadersOutputStreamResponseEntity

以某种方式返回一个让Spring处理它,那将是非常好的。它还将并行于我的函数的其他路径,我可以在其中成功返回.无论如何,我可以用春天做到这一点吗?ResponseEntityInputStreamResponseEntity


另外,我确实尝试返回只是为了看看春天是否会接受它。InputStreamResponseEntity

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

但它会引发以下异常:

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

我可以通过直接设置所有内容来使我的函数正常工作,但我只想使用Spring来执行此操作。HttpServletResponse


答案 1

Spring的InputStreamResource运行良好。您需要手动设置内容长度,否则Spring似乎尝试读取流以获取内容长度。

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

我从未发现任何建议使用此类的网页。我只是猜到了,因为我注意到有一些关于使用ByteArrayResource的建议。


答案 2

推荐