我有一个Spring MVC方法,返回一个ResponseEntity。根据检索到的特定数据,有时需要将数据流返回给用户。在其他时候,它会返回流以外的内容,有时还会返回重定向。我绝对希望它是一个流而不是字节数组,因为它可能很大。
ResponseEntity
当前,我使用以下代码片段返回流:
HttpHeaders httpHeaders = createHttpHeaders(); IOUtils.copy(inputStream, httpServletResponse.getOutputStream()); return new ResponseEntity(httpHeaders, HttpStatus.OK);
不幸的是,这不允许Spring HttpHeaders数据实际填充响应中的HTTP标头。这是有道理的,因为我的代码OutputStream在Spring接收之前写入了ResponseEntity。
HttpHeaders
OutputStream
以某种方式让Spring ResponseEntity用InputStreama让它处理它会很好。它还将与我的函数的其他路径平行,使我可以成功返回a ResponseEntity。无论如何,我可以用Spring完成吗?
InputStreama
另外,我确实尝试将InputStreamin 返回,ResponseEntity只是看看Spring是否会接受它。
InputStream
return new ResponseEntity(inputStream, httpHeaders, HttpStatus.OK);
但是它抛出了这个异常:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
我可以通过HttpServletResponse直接设置所有功能来使我的函数正常工作,但是我只想用Spring来做到这一点。
Spring的InputStreamResource效果很好。你需要手动设置Content-Length,否则Spring会尝试读取流以获取Content-Length。
InputStreamResource inputStreamResource = new InputStreamResource(inputStream); httpHeaders.setContentLength(contentLengthOfStream); return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);
我从未找到任何建议使用此类的网页。我只是猜对了,因为我注意到使用ByteArrayResource有一些建议。