5

ユーザーがボタンをクリックしたときのクライアント側ブラウザの Windchill GUI 特定の pdf ファイルをシステムにダウンロードする必要があります。次のコードを使用してこれを実現しました。

   <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: ......

……

この例外に関しては、グーグルで利用可能な投稿がたくさんありますが、私の間違いをクリアすることはできません. また、これをjspの代わりにサーブレットに追加しようとしました。それも同じ例外を示しています。この方法はファイルをダウンロードするのに正しいですか、それとも間違った方法ですか? 私は助けが必要です

ありがとう

4

3 に答える 3

15

同じ応答で と の両方getServletOutputStream()を使用することはできません。getWriter()

あなたの問題に来ます。JSP でスクリプトレットを記述しないようにします。JSP で何をしていても、サーブレットで実装します。

response.getOutputStream();違法な JSP を呼び出しています。ServletResponse.getOutputStream()または のいずれかを使用する必要がありますServletResponse.getWriter()。JSP はデフォルトで ServletResponse.getWriter() を使用するため。ServletResponse.getOutputStream() の代わりに ServletResponse.getWriter() に書き込む必要があります

これは Java Doc が言うことです:

getOutputStream...

ServletOutputStream getOutputStream() が IOException をスローする

レスポンスにバイナリ データを書き込むのに適した ServletOutputStream を返します。サーブレット コンテナはバイナリ データをエンコードしません。

ServletOutputStream で flush() を呼び出すと、応答がコミットされます。本文を書き込むために、このメソッドまたは getWriter() のいずれかを呼び出すことができますが、両方を呼び出すことはできません。

戻り値: バイナリ データを書き込むための ServletOutputStream 例外: IllegalStateException - このレスポンスで getWriter メソッドが呼び出された場合

于 2013-03-28T08:16:11.713 に答える
1

この行から例外がスローされたようです。

out.println(e);

アプリケーションとして PDF を送信するコードが書き込み中に失敗した場合、例外がスローされ、上記の行で例外を出力しようとしているときに、outputputstream が既に使用されています。

JSP で UI とビジネス ロジックを混在させないでください。このジョブを実行するには、サーブレットを使用します。

于 2013-03-28T07:31:14.383 に答える
0

スクリプトレットの後があります</body>。応答出力ストリームに何かを出力しますが、それは既に閉じています。

<body>実際にやりたいことが PDF をクライアントにストリーミングすることである場合、応答にタグを含めることにどのような意味があるでしょうか?

于 2013-03-28T07:33:56.193 に答える