【问题标题】:Download process is not visible while servlet is downloading pdfservlet 下载 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());
        }

【问题讨论】:

    标签: java servlets download


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 2010-12-22
      相关资源
      最近更新 更多