[英]Streaming a file in Liferay Portlet
我已经以一种简单的方式编写了文件下载:
@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中真正流式传输文件?
你在哪儿 我担心您是在这样做,而不是呈现portlet的HTML(例如,呈现阶段)。 通常,portlet内容嵌入在HTML页面中,因此您需要资源阶段,该阶段(大致)表现得像servlet。
另外,您提供的代码与您提出的实际问题也不匹配:您使用注释//read from input stream (file), write file to os
并询问如何做不同的操作以使内存中没有完整的内容。
由于注释中没有任何内容,因此您可以在写入输出流的同时循环读取输入文件:潜在的问题是什么? 您在门户网站环境中实现下载流时是否遇到问题,或者在写入流时从文件读取时遇到困难(即使用过多内存)?
编辑 :感谢您的澄清。 您是否尝试过更早地冲洗流? 您可以随时随地执行此操作-例如,每个循环(尽管可能有点太多)。 另外,请记住,浏览器以及文件本身必须以您期望的方式处理它:如果未对图像进行“增量”编码,则浏览器可能不会以这种方式显示它。
您是否也尝试过使用大文件? 可能是因为您的文件太小而无法触发自动刷新才被触发...
另外,我认为filename*=UTF-8''
看起来很奇怪。 可能是有效的编码,但我从未见过
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.