我想创建一个下载和上传大文件的应用程序,所以我不想将文件内容存储在内存中。用spring mvc流式传输大文件
在MVC控制器端我使用一个转换为/从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);
}
}
这非常适用于服务器端的HTTP消息转换器。
在客户端(RestTemplate)一侧,我尝试使用相同的转换器,但我得到了一个异常,该流已关闭(可能在请求完成时关闭)。
客户端代码:
ResponseEntity<InputStream> res = rest.getForEntity(url, InputStream.class);
// res.getBody() is closed
我也试着输入流复制到缓冲区中,并创建一个新的ByteArrayInputStream的,并将其返回到客户端RestTemplate和它的工作很好,但它确实要求数据将被读入内存中,这不符合我的要求。
我的问题是如何保持流打开,直到我处理它,而无需将它全部读入内存/文件?
任何想法将不胜感激。
问候,吉文
你需要输入和输出,而不实际保存任何东西,这个页面我会认为包含这样做的大多数方法:http://stackoverflow.com/questions/43157/easy-way-to-write-contents -of-a-java-inputstream-to-an-outputstream – mwarren 2014-11-03 11:44:51
此解决方案的问题在于,在消息转换器中,我不知道如何处理该文件。将它保存到一个文件?保存到数据库?等等,只有客户端知道如何处理它。 – shayma 2014-11-03 12:44:44