• 締切済み

ダウンロードサーブレットでキャンセル時のエラー

ファイルをダウンロードさせるservletを以下のソースのように作っています。 ブラウザ側で「ファイルの保存ダイアログ」の「キャンセル」を行われた際に以下のようなエラーが表示されます。 エラーを回避する方法、あるいは対処の方法はあるのでしょうか?どなたかご教授下さい。 環境:Windows XP,Tomcat 5.0.28,IE 6.0 ソース(一部) --------------- String fileName1= rs.getString(1); InputStream data = rs.getBinaryStream(2); String contentType = rs.getString(3); String fileName2 = URLEncoder.encode(fileName1,"UTF-8"); //contentTypeを出力 response.setContentType(contentType); //ファイル名の送信(attachment部分をinlineに変更すればインライン表示) response.addHeader("Content-disposition","attachment; filename=\""+fileName2+"\""); //ファイル内容の出力 ServletOutputStream out = response.getOutputStream(); //InputStream fin = new InputStream(fileName2); int size; while((size = data.read(buffer))!=-1){ out.write(buffer,0,size);  //←エラー発生箇所 } data.close(); out.flush(); out.close(); エラー -------------- ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error at org.apache.coyote.tomcat5.OutputBuffer.realWriteBytes(OutputBuffer.java:373) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:398) ・・・

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.1

ClientAbortExceptionをcatchして エラー処理を書けばいいのではないですか?

aki_a55
質問者

補足

ご回答ありがとうございます。 確かにおっしゃる通りだと思うのですが ブラウザ側でキャンセル時以外の場合にClientAbortExceptionが発生する可能性はないのでしょうか? また、エラー発生箇所の前に、ブラウザ側でキャンセルされたこと、 あるいは通信??がなくなったことを察知して、処理を分岐させるといったことは不可能なのでしょうか? サーブレットを始めたばかりでわからない事が多く、 変な質問かも知れませんがどうぞよろしくお願いします。

関連するQ&A

  • jsp、サーブレットの質問です。

    Tomcatを使用してjspとサーブレットを使い掲示板のような投稿サイトもどきを作成していますが解決できない部分があります。 ↓は表示用のjspです♪ <html> <head> <title>Insert title here</title> </head> <body> <% String lsts = (String)request.getAttribute("lst"); %> <table border="4"> <tr> <td>日時</td> <td>タイトル</td> <td>スレッド主</td> <td></td> </tr> <tr> <td><%for(int i = 0; i<lsts.length(); i++){ out.println(lsts); } %> </td> <td><%out.println(); %></td> <td><%out.println("");%></td> <td> </td> </tr> </table> </form> </body> </html> こちらがサーブレットです otected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*DB接続処理は省略します*/ try{ ps = (PreparedStatement) con.prepareStatement(sql); String sql = "select * from thred"; ResultSet rs = ps.executeQuery(); //テーブル内一覧取得 while(rs.next()){ rs.getString("time"); rs.getString("title"); rs.getString("id"); rs.getString("thredid"); String s = (rs.getString("time")+","+ rs.getString("title")+","+rs.getString("id")); String[] lsts = s.split(","); List<String> thlists = Arrays.asList(lsts); String ss = (thlists.get(0)); request.setAttribute("thlst",ss); RequestDispatcher dispatcher= request.getRequestDispatcher("/list.jsp"); dispatcher.forward(request,response); } }catch(SQLException e){ e.printStackTrace(); } catch(ClassNotFoundException e){ e.printStackTrace(); }finally{ try { con.close(); } } } jspの方にサーブレットでthredDBから抜き取ったtimeとtitleとidを全て表示させたいのですが 現状だと 2014-06-03 06:45:02  aaaa 1 の行だけがたくさん表示されてしまいます 恐らくスコープを取得した時点でこの↑の1行のものしかとれてこれていないのだと思います... どのように処理を行ったらよいのでしょうか? DBの中身は画像添付いたしますっ

  • サーブレット(doGetメソッド内)でMySQLテーブル内を、

    サーブレット(doGetメソッド内)でMySQLテーブル内を、 CSVファイルとしてクライアントへダウンロードする以下プログラムで、 UTF-16LE(BOM無し)でCSVファイルが正常に出力されております。 そこでご質問内容なのですが、このCSVを出力する際に、 BOM無しではなくて、 「BOM有り」でCSVファイル出力する(BOMを追加する)方法を教えてください。   ↓ final ResultSetMetaData meta = rs.getMetaData(); (上記のrsは、MySQLテーブル内をSELECTしたレコードセットです) response.setContentType("application/octet-stream;charset=utf-16le"); response.setHeader("Content-Disposition", "attachment; filename=" + "KYOIKU.csv"); out = response.getWriter(); for (int i = 1; i <= meta.getColumnCount(); i++) { out.print("\"" + meta.getColumnName(i) + "\""); out.print(i < meta.getColumnCount() ? "\t" : ""); } out.print("\r\n"); while (rs.next()) { for (int i = 1; i <= meta.getColumnCount(); i++) { out.print("\"" + rs.getString(i) + "\""); out.print(i < meta.getColumnCount() ? "\t" : ""); } out.print("\r\n"); } } catch (final NumberFormatException e) { (以下省略) お世話になります 以上、宜しくお願い致します。

    • ベストアンサー
    • Java
  • ファイルダウンロードの「開く」を使用不可にしたい

    早速質問をさせていただきます。 VisualWebDeveloper2005ExpressEditionでWEBアプリを作成しています。 Wordファイルの雛形にデータを流しこんで、ユーザー側にダウンロードさせようとしております。 ダウンロードダイアログの「開く」ボタンだけを押せないようにする事は可能でしょうか? ご教授よろしくお願い致します。 '//ダウンロード処理 Dim str As String = "attachment;filename=word2003file.doc" Response.AppendHeader("Content-Disposition", str) Response.ContentType = "Application/msword" Response.WriteFile("Wordファイルのパス") Response.Flush() IO.File.Delete("Wordファイルのパス") Response.End()

  • strutsでファイルダウンロード(WinでOK,linuxでNG)

    strutsでWindowsのexeファイルのダウンロードを実装しましたが、Windows上のtomcatにdeployすると正常にダウンロードできるのに、linux(fedora-core3)上のtomcatにdeployすると、ダウンロードしたファイルがhtmlになってしまいます。 hoge.exeという名前のファイルはダウンロードできるのですが、それが実はテキストで、メモ帳で開くと、ダウンロード画面のhtmlが表示されます。 この状況は何によって生み出されているのでしょうか。 お分かりになる方、ヒントをお願いいたします。 以下にファイルダウンロード部のソース(抜粋)を掲載させていただきます。 ----- 以下ソース ----- protected void download(HttpServletResponse response, String fileType, String filename) { try { // exeファイルのダウンロード時 if (fileType.equals("application/octet-stream")) { response.setHeader("Content-Disposition", "attachment; filename=" + filename); } response.setContentType(fileType); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filename)); BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); byte[] buf = new byte[128]; int size; while ((size = bis.read(buf, 0, buf.length)) != -1) { bos.write(buf, 0, size); } bos.close(); bis.close(); } catch (IOException e) { throw new thisSystemException("could not send file[" + filename + "]"); }

    • ベストアンサー
    • Java
  • サーブレットのコンパイルエラー

    会社の開発環境でコンパイルできたサーブレットを 自宅でコンパイルしようとすると、下のエラーが出てしまい困っています。だれか知恵を貸してください。 ちなみに自宅の開発環境は j2sdk1.4.0とtomcat3.2.3 です。 よろしくお願いします。 ----------------------------------- ReserveControlServlet.java:26: シンボルを解釈処理できません。 シンボル: メソッド setCharacterEncoding (java.lang.String) 位置 : javax.servlet.http.HttpServletRequest の インタフェース request.setCharacterEncoding("JISAutoDetect"); ^ ReserveControlServlet.java:33: シンボルを解釈処理できません。 シンボル: メソッド getRequestDispacher (java.lang.String) 位置 : javax.servlet.ServletContext の インタフェース sc.getRequestDispacher("/index.jsp").forward(request, response); ------------------------------------

    • ベストアンサー
    • Java
  • 始めてのサーブレットでつまづいています。アドバイス下さい。

    【参考ファイル】 http://www.hellohiro.com/servlet.htm ----------------------------------------------------------- 【ソース HelloWorldServlet.java】 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // ContentTypeを設定 response.setContentType("text/html; charset=Shift_JIS"); // 出力用PrintWriterを取得 PrintWriter out = response.getWriter(); // 出力 out.println("<html>"); out.println("<head>"); out.println("<title>Hello World Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello World"); out.println("</body>"); out.println("</html>"); } } ----------------------------------------------------------- 【バージョン】 [java] C:\j2sdk1.4.2_06 [Tomcat] C:\Program Files\Apache Software Foundation\Tomcat 5.5 ----------------------------------------------------------- 【環境変数】 [CLASSPATH] .;C:\Program Files\Java\j2re1.4.1_02\lib\ext\QTJava.zip [Path] C:\j2sdk1.4.2_06\bin;C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\servlet-api.jar ----------------------------------------------------------- 【エラー内容】 C:\Program Files\Apache Group\Apache2\htdocs\java\hello>javac HelloWorldServlet. java HelloWorldServlet.java:2: パッケージ javax.servlet は存在しません。 import javax.servlet.*; ^ HelloWorldServlet.java:3: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.*; ^ HelloWorldServlet.java:5: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : HelloWorldServlet の クラス public class HelloWorldServlet extends HttpServlet { ^ HelloWorldServlet.java:6: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : HelloWorldServlet の クラス public void service(HttpServletRequest request, ^ HelloWorldServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : HelloWorldServlet の クラス HttpServletResponse response) ^ HelloWorldServlet.java:8: シンボルを解決できません。 シンボル: クラス ServletException 場所 : HelloWorldServlet の クラス throws ServletException, IOException { ^ エラー 6 個 C:\Program Files\Apache Group\Apache2\htdocs\java\hello>

    • ベストアンサー
    • Java
  • HTMLの質問なのかJAVAサーブレットの質問なのか微妙なのですがテー

    HTMLの質問なのかJAVAサーブレットの質問なのか微妙なのですがテーブルを一行に二つ表示したいのですが表示はできるんですが表示位置を中央にすることができなくて困ってます どうすれば中央にすることができますか? while(rs2.next()){ String name = rs2.getString("st.staff_name"); String kana = rs2.getString("st.staff_kana"); String birthday = rs2.getString("st.birthday"); String sex = rs2.getString("sm.sex"); String blood = rs2.getString("bm.blood_type"); String hight = rs2.getString("st.hight"); String weight = rs2.getString("st.weight"); String reration = rs2.getString("st.reration"); String mobile = rs2.getString("st.mobile_tel"); String tel = rs2.getString("st.tel"); out.println("<br></br><TABLE border=0 align=\"center\"><table border=1 align=\"left\"><tr><th width=150>氏名</th>"); out.println("<td width=200>"+name+"</td></tr><tr>"); out.println("<th>ヨミガナ</th>"); out.println("<td>"+kana+"</td></tr><tr>"); out.println("<th>生年月日</th>"); out.println("<td>"+birthday.replace("-", "/")+"</td></tr><tr>"); out.println("<th>性別</th>"); out.println("<td>"+sex+"</td></tr><tr>"); out.println("<tr><th>身長</th>"); out.println("<td>"+hight+"</td></tr>"); out.println("<tr><th>体重</th>"); out.println("<td>"+weight+"</td></tr>"); out.println("<tr><th>血液型</th>"); out.println("<td>"+blood+"</td></tr>"); out.println("<tr><th>携帯電話番号</th>"); String mtel=""; if(mobile!=null&&mobile.length()>0){ for (int i = 0; i < mobile.length(); i++) { char ch = mobile.charAt(i); if(i==3){ mtel+="-"; } if(i==7){ mtel+="-"; } mtel+=ch; if(mobile.length()==0){ mtel="-"; } } }else{ mtel="不所持"; } out.println("<td>"+mtel+"</td></tr>"); out.println("<tr><th>自宅電話番号</th>"); String ttel=""; for (int i = 0; i < tel.length(); i++) { char ch = tel.charAt(i); if(i==4){ ttel+="-"; } if(i==6){ ttel+="-"; } ttel+=ch; } out.println("<td>"+ttel+"</td></tr>"); out.println("<tr><th>続柄</th>"); out.println("<td>"+reration+"</td>"); out.println("</tr></table>");

  • ファイルのストーリーム配布時のファイルサイズ

    IIS6.0 IE6or7 ASP(vbScript) こんにちは。よろしくお願いします. エクセルやワードファイルを直接URLで叩くと ブラウザの中で開いてしまいます. それを避けるために下記のようにしてファイルをストリームとして渡すようにし、問題を回避しようとしました. しかし、ファイルサイズが小さい場合は問題なくDLできるのですが、 1Mを越えたあたりから一瞬でエラー画面になりDLできず、困っています. IISの設定なのか、よくわかりません。 下記以外の方法でも構いませんので、解決方法等ありましたら 御教示願います. Response.AddHeader "Content-Disposition" , " attachment; ilename=" & FileName Response.ContentType = "application/octet-stream;name=" & FileName Set obj = CreateObject("ADODB.Stream") obj.Open obj.Type = 1 obj.LoadFromFile("フォルダパス" & "\" & FileName) Response.BinaryWrite obj.Read() obj.Close

  • コンパイルエラー

    現在勉強の為、JSPでショッピングカートを作成中です。 その中でDBからデータを読み込み商品一覧を出すプログラムを作っていますが、コンパイルエラーが出てしまいうまくできません。 ソースは <%@ page import="java.sql.*" %> <% Connection con = null; ResultSet rs = null; Class.forName("oracle.jdbc.OracleDriver"); con = DriverManager.getConnection("jdbc:oracle:thin//localhost:1521/bit21"); Statement stmt = con.createStatement(); // 実行して結果セットを取得する rs = stmt.executeQuery("SELECT * FROM BOOKMST"); // 結果セットの分だけループして表示する while (rs.next()) { %> <%= rs.getstring("SALEDATE") %> <table> <tr align="center"><td>定価:</TD><TD><%= rs.getstring("PRICE") %></TD><TD>円</td></tr> </td></tr></TABLE> <% } con.close(); %> でエラー内容は C:\tomcat-5.0.28\work\Catalina\localhost\bookshop\org\apache\jsp\lineup_jsp.java :84: シンボルを解決できません。 シンボル: メソッド getstring (java.lang.String) 場所 : java.sql.ResultSet の インタフェース out.print( rs.getstring("PRICE") ); ^ です。 どこが間違っているのかわからず困っています。 どなたかご教授お願い致します。

    • ベストアンサー
    • Java
  • サーブレットからIMGタグへ画像が送れない

    Apache1.3.26とTomcat4.0.6でjava1.4でIEに画像を表示するシステムを開発しています。 Tableタグで構成した表内に、サーブレットをリンク先としたIMGタグを3つ記述してあります。   <tr><td>     <img src='../servlet?param='aa''></a>   </td><tr/><tr><td>     <img src='../servlet?param='bb''></a>   </td><tr/><tr><td>     <img src='../servlet?param='cc''></a>   </td><tr/> このタグ内に記述しているサーブレットでは、DBより取得したパスを元にJpegファイルを 読込み、レスポンスに渡しています。   response.setContentType("image/pjpeg");   response.addHeader("Content-Disposition","inline; filename=" + fileName);   InputStream in = null;   OutputStream out = null;   try {     in = new FileInputStream(ImagePath);     out = response.getOutputStream();     int b;     while ((b = in.read()) != -1) {       out.write(b);       break ;     }   } finally {     if (in != null) {       in.close();     }     if (out != null) {       out.flush();       out.close();     }   } IEにこのHTMLを表示させると、ほとんどの場合はJpeg画像が表示されるのですが、 まれに表示されずに×印が出てしまうことがあります。 右クリックメニューより「画像の表示」を行うと表示されますが、ページを表示した際に表示されていないと使えるシステムとなりません。 何が原因なのかわからず、対処のしようがない状態です。 どなたか原因、対処方法についてご教授いただけないでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう