我以简单的方式编写了下载文件:
@ResourceMapping(value = "content")
public void download(ResourceRequest request, ResourceResponse response) {
//...
SerializableInputStream serializableInputStream = someService.getSerializableInputStream(id_of_some_file);
response.addProperty(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate");
response.setContentType(contentType);
response.addProperty(HttpHeaders.CONTENT_TYPE, contentType);
response.addProperty(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''"
+ URLEncoder.encode(fileName, "UTF-8"));
OutputStream outputStream = response.getPortletOutputStream();
byte[] parcel = new byte[4096];
while (serializableInputStream.read(parcel) > 0)
outputStream.write(parcel);
outputStream.flush();
serializableInputStream.close();
outputStream.close();
//...
}
SerializableInputStream
此处描述了- JavaDocs。它允许对 InputStream 进行序列化,例如,通过远程处理传递。
我从输入读取并将其写入输出,而不是一次写入所有字节。但不幸的是,portlet 并没有“流式传输”内容——文件(例如图像)只有在读取整个输入流之后才会发送到浏览器——这就是它的样子。我看到从数据库(从实时日志)中读取的文件,但我没有在屏幕上看到任何“增长”的图像。
我究竟做错了什么?是否可以在 Liferay 6.0.6 和 Spring Portlet MVC 中真正流式传输文件?