【发布时间】:2014-11-03 09:46:01
【问题描述】:
我正在尝试创建一个下载和上传大文件的应用程序,因此我不希望将文件内容存储在内存中。
在 mvc 控制器端,我使用了一个 http 消息转换器,它可以转换为 InputStream 或从 InputStream 转换
@Override
public InputStream read(Class<? extends InputStream> 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<InputStream> res = rest.getForEntity(url, InputStream.class);
// res.getBody() is closed
我还尝试将输入流复制到缓冲区并创建一个新的 ByteArrayInputStream 并将其返回给 RestTemplate 客户端,它运行良好,但是它确实需要将数据读入不适合的内存我的要求。
我的问题是如何保持流打开直到我处理它而不必将其全部读入内存/文件?
任何想法都会受到赞赏。
问候,谢伊
【问题讨论】:
-
你需要输入和输出而不实际保存任何东西,我认为这个页面包含了大多数这样做的方法:stackoverflow.com/questions/43157/…
-
这个解决方案的问题是在消息转换器中我还不知道如何处理该文件。将其保存到文件中?保存到数据库?等等。只有客户端知道如何处理它。
标签: java spring spring-mvc resttemplate