你好,我使用这个XAgent和这个SSJS代码从服务器文件系统流式传输文件:
var filepath="c:/test/file.pdf" //380MB of file
var extContext:javax.faces.context.ExternalContext = facesContext.getExternalContext();
var response:com.ibm.xsp.webapp.XspHttpServletResponse = extContext.getResponse();
var writer:javax.servlet.ServletOutputStream = response.getOutputStream();
estensione=@Right(filepath,3).toLowerCase();
fileName=@RightBack(filepath,"/");
contentype="application/octet-stream";
contentype=(estensione=="pdf")?"application/pdf":contentype;
response.setContentType(contentype); // content type of data, for other binary see mime types or put "application/octet-stream"
response.setHeader("Cache-Control", "no-cache");
var filestream:java.io.File = new java.io.File(filepath); //for check file size
var maxfilesize:long=20*1024*1024;
var typestream= filestream.length()>maxfilesize?"attachment;":"inline;";
response.setHeader("Content-Disposition" ,typestream+" filename="" + fileName+"""); //31/12/2015 required if You need to pass it back as file
response.setHeader("Content-Length", ""+filestream.length());
var inStream:java.io.FileInputStream = new java.io.FileInputStream(filepath);
var btbuffer:byte= new byte[32767];
var ilen,bytesBuffered:int=0;
while ((ilen=inStream.read(btbuffer))!=-1){
writer.write(btbuffer,0,ilen)
writer.flush(); //31/12/2015 - flush writer but don't work
}
inStream.close();
writer.close();
facesContext.responseComplete();
代码工作正常。。但是当我们在同一时间内有2个或更多的下载时,服务器显示HTTP JVM:java.lang.OutOfMemoryError:,因为我有1024M NOTES.INI设置。
真正的问题是Servlet输出流,它使用内存中的总文件大小javaheap,并在客户端下载终止或取消后释放它。有人知道如何修复吗?我读过这个问题和这个问题,但都没有成功。
2016年1月4日更新
我已经解决了在响应分配后使用此行代码的问题:
response.disableXspCache(false);
false参数是必需的!
最后我也删除了代码writer.close()
感谢Sven的博客和RiandPhilippe
XPages运行时默认缓冲页面结果,直到整个页面完成。这允许运行时在出现错误时完全恢复结果,并发出错误消息。这是由XspHttpServlet响应完成的。
您可以通过强制转换响应并在此类上调用disableXspCache()来更改此行为。