5

当用户单击按钮时,客户端浏览器上的 Windchill GUI 应下载到他的系统上。我通过使用以下代码实现了这一点。

   <body>
    <%
    String pdfname=   session.getAttribute("pdfname").toString();
    String Pdfpath=   session.getAttribute("pdfpath").toString();
    File f =new File(Pdfpath);
     Boolean flag=false;
      if(f.exists())
      {
     BufferedInputStream filein = null;
     BufferedOutputStream out2=null;
    try {
    File file = new File(Pdfpath);//specify the file path
    byte b[] = new byte[1048576];
    int len = 0;
    filein = new BufferedInputStream(new FileInputStream(file));
    out2=new BufferedOutputStream(response.getOutputStream());
    response.setHeader("Content-Length", ""+file.length());
    response.setContentType("application/pdf");
    response.setHeader("Content-Disposition","attachment;filename="+pdfname);
    response.setHeader("Content-Transfer-Encoding", "binary");
    while ((len = filein.read(b)) > 0) {
    out2.write(b, 0, len);
    out.println("Your Pdf Document Is Generated Please close it");
    }
    filein.close();
    out2.flush();
    out2.close();
  }
    catch(Exception e)
{
    out.println(e);
    }

      }else{

        String error ="File Not Found Or File Has Bean Deleted Already";
        request.setAttribute("error", error);
        RequestDispatcher s = request.getRequestDispatcher("NoFile.jsp");
                s.forward(request, response);
    }
     %>
    </body>

此代码工作正常,文件正在下载,但之后它会引发异常。以下是我的方法服务器日志

ERROR : org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/Windchill].[jsp]  - Servlet.service() for servlet jsp threw exception
Thu 3/28/13 12:29:07: TP-Processor7: java.lang.IllegalStateException: Already using output stream
Thu 3/28/13 12:29:07: TP-Processor7:    at wt.servlet.CompressionFilter$GzippingResponse.getWriter(CompressionFilter.java:860)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jasper.runtime.JspWriterImpl.close(JspWriterImpl.java:187)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jsp.netmarkets.jsp.gt.get_jsp._jspService(get_jsp.java:105)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
Thu 3/28/13 12:29:07: TP-Processor7:    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
Thu 3/28/13 12:29:07: TP-Processor7:    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
Thu 3/28/13 12:29:07: TP-Processor7:    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
Thu 3/28/13 12:29:07: TP-Processor7: ......

……

谷歌有很多关于这个例外的帖子,但我无法清除我的错误。我也尝试在 servlet 而不是 jsp 中添加它。这也显示了同样的异常。这种方式对于下载文件是否正确,或者我的方式错误?我需要帮助

谢谢

4

3 回答 3

15

您不能同时使用getServletOutputStream()getWriter()在相同的响应中。

来解决你的问题。避免在 JSP 中编写 scriptlet。无论你在 JSP 中做什么,都在 Servlet 中实现它。

response.getOutputStream();在 JSP 中调用这是非法的。您应该使用ServletResponse.getOutputStream()ServletResponse.getWriter()。由于 JSP 默认使用 ServletResponse.getWriter()。您应该写入 ServletResponse.getWriter() 而不是 ServletResponse.getOutputStream()

这就是 Java Doc 所说的:

获取输出流...

ServletOutputStream getOutputStream() 抛出 IOException

返回适合在响应中写入二进制数据的 ServletOutputStream。servlet 容器不对二进制数据进行编码。

在 ServletOutputStream 上调用 flush() 会提交响应。可以调用此方法或 getWriter() 来编写正文,而不是两者。

返回:用于写入二进制数据的 ServletOutputStream 抛出:IllegalStateException - 如果已在此响应上调用 getWriter 方法

于 2013-03-28T08:16:11.713 回答
1

似乎从这一行引发了异常。

out.println(e);

如果您在编写过程中将 PDF 作为应用程序发送的代码失败,那么它将抛出异常,并且在尝试使用上述行打印异常时,输出输入流已经被使用。

不要在 JSP 中混合 UI 和业务逻辑。使用 Servlet 来完成这项工作。

于 2013-03-28T07:31:14.383 回答
0

你有</body>你的脚本。它会在响应输出流中打印一些内容,但您之前已经关闭了那个。

<body>当您真正想要做的是将 PDF 流式传输回客户端时,在您的响应中包含标签有什么意义?

于 2013-03-28T07:33:56.193 回答