用spring mvc流式传输大文件

我正在尝试创建一个下载和上传大文件的应用程序,因此我不希望将文件内容存储在内存中。

在mvc控制器端,我正在使用一个转换为/从InputStream转换的http消息转换器

@Override public InputStream read(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { return inputMessage.getBody(); } @Override public void write(InputStream t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { try { IOUtils.copy(t, outputMessage.getBody()); } finally { IOUtils.closeQuietly(t); } } 

这在服务器端很好用。

在客户端(RestTemplate)方面,我尝试使用相同的转换器,但我得到一个例外,即流已关闭(可能在请求完成时关闭)。

客户端代码:

 ResponseEntity res = rest.getForEntity(url, InputStream.class); // res.getBody() is closed 

我还尝试将输入流复制到缓冲区并创建一个新的ByteArrayInputStream并将其返回到RestTemplate客户端,它运行良好,但它确实需要将数据读入内存,这不符合我的要求。

我的问题是如何保持流打开,直到我处理它而不必将其全部读入内存/文件?

任何想法将不胜感激。

问候,谢伊

据我所知,RestTemplate的getForEntity()不是获取InputStream的合适方法。 它可以方便地转换为实体类,也可以转换为实体类,因此可能是您的问题所在。

由于您习惯于HttpInputMessage,为什么不在客户端使用HttpInputMessage.getBody()呢? 它会为您提供一个很好的InputStream,它可以直接传递给OutputStream,例如HttpServletResponse.getOutputStream()。

检查Spring MVC如何使用org.springframework.web.multipart.commons.CommonsMultipartResolver处理大型文件上传。 它有一个’maxInMemorySize’,可以帮助控制内存需求。 请参阅此线程以使用带有REST模板的多部分解析程序将多部分文件作为POST参数与RestTemplate请求一起发送