我有一个要求,我需要处理一组文件并从中创建一个压缩的zip文件,然后使用它进行下载。我使用Servlet下载该文件,但下载需要很长时间。因此,我希望用户知道servlet正在通过打印编写器输出消息来处理请求,而不是向他显示一个空白屏幕。但每次我使用打印编写器向屏幕写入内容时,消息需要花费大量时间来显示在屏幕上,文件没有下载。 我怎样才能实现这一目标?任何想法? 感谢。
这是我的代码
OutputStream oStream = null;
DataInputStream dInput = null;
File file = new File(("PATH"));
int length = 0;
try{
DownloadServerLogs.processLogs();
oStream = res.getOutputStream();
res.setContentType("application/zip");
res.setContentLength((int)file.length());
res.setHeader("Content-Disposition",
"attachment;filename=\"" + file.getName() + "\"" );
byte[] bbuf = new byte[BYTES_DOWNLOAD];
dInput = new DataInputStream(new FileInputStream(file));
while ((dInput != null) && ((length = dInput.read(bbuf)) != -1))
{
oStream.write(bbuf,0,length);
}
dInput.close();
oStream.flush();
oStream.close();
}catch(Exception e){
Utility.getLogger().error(e.getMessage(), e);
}
答案 0 :(得分:0)
我想通过使用类似Javascript(假设您使用AJAX调用servlet)来向客户端显示消息更好。
答案 1 :(得分:0)
嗯,这样做可能不那么安全。我看看下面的答案。这不是你的确切问题,但可能类似。
Most efficient way to create InputStream from OutputStream
实际上,你正在同一个线程上阅读和写作,我的猜测是,随着PrintWriter的加入,你在某个地方陷入僵局。