使用 Spring MVC 的 ResponseEntity 返回一个流

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

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

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


return new ResponseEntity(httpHeaders, HttpStatus.OK);

遗憾的是,这不允许 SpringHttpHeaders数据实际填充响应中的 HTTPHeader。这是有意义的,因为我的代码在 Spring 接收到 ResponseEntity之前写入 OutputStream

以某种方式返回一个带有 InputStreamResponseEntity,并让 Spring 处理它,这将是非常好的。它还将平行于函数的其他路径,在这些路径中我可以成功地返回 ResponseEntity。有没有什么办法可以让我用 Spring 来完成呢?


另外,我尝试返回 ResponseEntity中的 InputStream,只是为了看看 Spring 是否会接受它。

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

但它抛出了一个例外:

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

我可以通过直接设置 HttpServletResponse上的所有内容来使我的函数工作,但是我想只用 Spring 来做这件事。

88274 次浏览

Spring 的 输入流资源运行良好。您需要手动设置 Content-Llength,否则似乎 Spring 尝试读取流以获取 Content-Llength。

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

我从来没有发现任何网页建议使用这个类。我之所以猜到是因为我注意到有一些关于使用 ByteArrayResource 的建议。