servlet 下载 pdf 时,下载过程不可见
Posted
技术标签:
【中文标题】servlet 下载 pdf 时,下载过程不可见【英文标题】:Download process is not visible while servlet is downloading pdf 【发布时间】:2011-11-16 04:54:14 【问题描述】:我正在使用 content-disposition 下载 pdf 。当我单击下载按钮时,首先下载完整的 pdf 文件,然后浏览器显示保存文件的对话框。我希望浏览器显示下载过程。以下是我的servlet代码:
String filename = "abc.pdf";
String filepath = "/pdf/" + filename;
resp.setContentType("application/pdf");
resp.addHeader("content-disposition", "attachment; filename=" + filename);
ServletContext ctx = getServletContext();
InputStream is = ctx.getResourceAsStream(filepath);
System.out.println(is.toString());
int read = 0;
byte[] bytes = new byte[1024];
OutputStream os = resp.getOutputStream();
while ((read = is.read(bytes)) != -1)
os.write(bytes, 0, read);
System.out.println(read);
os.flush();
os.close();
catch(Exception ex)
logger.error("Exception occurred while downloading pdf -- "+ex.getMessage());
System.out.println(ex.getStackTrace());
【问题讨论】:
【参考方案1】:如果客户端事先不知道响应正文的内容长度,则无法确定进度。要让客户端知道内容长度,需要在服务端设置Content-Length
标头。
换行
InputStream is = ctx.getResourceAsStream(filepath);
到
URL resource = ctx.getResource(filepath);
URLConnection connection = resource.openConnection();
response.setContentLength(connection.getContentLength()); // <---
InputStream is = connection.getInputStream();
// ...
与具体问题无关,您的异常处理很糟糕。换行
System.out.println(ex.getStackTrace());
通过
throw new ServletException(ex);
【讨论】:
以上是关于servlet 下载 pdf 时,下载过程不可见的主要内容,如果未能解决你的问题,请参考以下文章