• 締切済み
  • すぐに回答を!

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

ファイルをダウンロードさせる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) ・・・

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数4039
  • ありがとう数1

みんなの回答

  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

関連するQ&A

  • サーブレット(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
  • >続きJSPの表示問題

    <%@ page contentType="text/html; charset=euc-jp" %> <%@ page import="java.sql.*,atmarkit.MyDBAccess" %> ~略 int id = rs.getInt("member_id"); String name = rs.getString("name"); String age = rs.getString("age"); int state = rs.getInt("attendance"); String comment = rs.getString("comment"); if(comment != null){ comment = new String(comment.getBytes("ISO8859_1"),"EUC_JP"); } 画面でコメント欄に文字がいれて、うまく表示できないときがあります。具体的いうと「あ」いれて、エラーでます。 しかし「い」をいれたら 登録ボタン押して、表示ができました。 詳しい方いたら 教えてください。

  • 【SQLServer接続のJSPの記述を教えて下さい!】

    いつもありがとうござます。 今回、SQLServerのテーブルを使用したjspを作成しているのですが MS ACCESSしか使用した事がなく設定が分からなく困っています。 ソースはこんな感じです。 <%@ page contentType="text/html;charset=Windows-31J" %> <HTML> <HEAD> <TITLE>一覧</TITLE> </HEAD> <BODY bgcolor="#ffffcc"> <CENTER> <%@page import="java.sql.*"%> <% class.forName("sun.jdbc.odbc.JbdcOdbcDriver"); Connection con = DriverManager.getConnection(test,no,nono); string sql = "select * from T_Transfer"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()){ out.print(rs.getString("F1")); out.print(rs.getString("F2")); out.print(rs.getString("F3")); out.print(rs.getString("F4")); out.print(rs.getString("F5")); out.print(rs.getString("F6")); out.print(rs.getString("F7")); } con.close(); %> </CENTER> </BODY> </HTML> コンパイルできないとのエラーがでます。 xmlは記述が分からないので一切触っていません。 上記ソースの場合のxmlの記述もご教授下さい。 宜しくお願い致します!

    • ベストアンサー
    • Java
  • 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の中身は画像添付いたしますっ

  • データベースへのアクセスエラーについて

    はじめまして!大学でデータベースを学んでいるのですが、以下のプログラムを実行した際、「式の型が一致しません」というエラーが出ます。またアクセスしているテーブルmeiboにはフィールドに,IDと名前shakai,eigoなどのテーブルには,IDと得点(それぞれの科目の名前)がフィールドにあります。 よろしければ、ご回答よろしくお願いいたします。 import java.io.*; import java.sql.*; public class Ex1 { public static void main(String[] args) { Connection conn = null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection("jdbc:odbc:ex1"); Statement stmt = conn.createStatement(); BufferedReader r = new BufferedReader(new InputStreamReader(System.in), 1); System.out.print("学籍番号を入力してください : "); System.out.flush(); String number = r.readLine(); String select = "SELECT * from meibo,kokugo,sansuu,shakai,rika,eigo " + "where meibo.ID=kokugo.ID=sansuu.ID=shakai.ID=rika.ID=eigo.ID"; ResultSet rs = stmt.executeQuery(select); while(rs.getString("ID")!=number) rs.next(); // System.out.printf("%s\t",rs.getString("name")); System.out.printf("%s\t"," 国語 "+rs.getString("kokugo")); System.out.printf("%s\t"," 算数 "+rs.getString("sansuu")); System.out.printf("%s\t"," 社会 "+rs.getString("shakai")); System.out.printf("%s\t"," 理科 "+rs.getString("rika")); System.out.printf("%s\n"," 英語 "+rs.getString("eigo")); stmt.close(); conn.close(); } catch (Exception e) { System.out.println(e); } } }

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

    早速質問をさせていただきます。 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
  • BLOBをダウンロードして別ウインドウで表示したい。

    申し訳ありありませんが、どなたか答えていただけると幸いです。 byte[] data = bl.getBytes(1, (int)bl.length()); int imgSize = (int)bl.length(); String file = URLEncoder.encode(rs_index.getString(ファイル名)); response.setContentType("application/octet-stream-dummy"); response.setHeader("Content-Disposition","inline; filename=\"" + file + "\""); response.setHeader("Pragma", ""); response.setHeader("Cache-Control","max-age=0"); response.setContentLength(data.length); response.getOutputStream().write(data); response.flushBuffer(); こんな感じなのですが、IEでダウンロードして表示をしますと、 IEでEXCELなどが表示されてしまいます。 エクスプローラの設定をいじらずに、EXCELはEXCELで表示するように できないのでしょうか? HTMLのように、target="_blank"みたいにしたいのですが・・・ Java初心者なので、よくわかっていないかもしれませんが、 宜しくお願い致します。

  • データベースとのやり取り(サーブレット)

    String q1 = "USE riyou"; st.execute(q1); String q2 = "LOCK TABLE r1 WRITE"; st.execute(q2); String q3 = "SELECT * FROM r1 where ban=" + items[0]; ResultSet rs = st.executeQuery(q3); String set[] = {" ","0","1","2","3","4","5","6","7","8","9"}; for( int i = 0;i < 11;i++ ){ if( rs.getString("tou") == set[i] ){ out.println("test"); } out.println("" + set[i] + "0000000"); } touの中身は"1"なんですがIFの条件に合いません。なぜなんでしょうか??set[]の中には"1"が入っているはずなんですが・・・。ちなみにtouもset[2]も文字の"1"なんです。昨日から2日悩んでます;;原因のわかる方いましたらお願いします。

    • ベストアンサー
    • Java
  • JSP表示エラー?

    たびたびすみません リクエストから取ってきたコメントどうしても表示ができないです。 環境は tomcat5.5 postgresql8.2 データベースエンコーディングはEUC_JP JSPファイルもEUC形式で保存してます。 コメント欄に日本語を入力するとエラーが出てしまいます。 JSPファイル1 <%@ page contentType="text/html; charset=euc-jp"pageEncoding="euc-jp" %> <%@ page import="java.sql.*,atmarkit.MyDBAccess" %> <% // 内容: データベースにアクセスする MyDBAccess db = new MyDBAccess(); db.open(); ResultSet rs = db.getResultSet("SELECT * FROM SHAINLIST order by member_id"); String tableL = "<table border=1>"; tableL += "<tr bgcolor=\"000080\"><td><font color=\"white\">ID</font></td>" + "<td nowrap><font color=\"white\">名前</font></td>" + "<td colspan=2><font color=\"white\">出欠</font></td>"; while(rs.next()) { int id = rs.getInt("member_id"); String name = rs.getString("name"); String age = rs.getString("age"); int state = rs.getInt("attendance"); String comment = rs.getString("comment"); if(comment != null){ comment = new String(comment.getBytes("8859_1"),"EUC_JP"); } 以下~略 JSPファイル2 <%@ page contentType="text/html; charset=euc-jp"pageEncoding="euc-jp" %> <%@ page import="java.sql.*, atmarkit.MyDBAccess" %> <% // 内容: データベースにアクセスする // 入力された引数を取得する String comment = request.getParameter("comment"); String attendance = request.getParameter("attendance"); String member_id = request.getParameter("member_id"); // MyDBAccess のインスタンスを生成する MyDBAccess db = new MyDBAccess(); // データベースへのアクセス db.open(); // データベース更新用のSQL文を作成 String sql = "update shainlist set comment='" + comment + "', attendance=" + attendance + " where member_id=" + member_id; // SQL文を実行 db.execute(sql); くわしい方教えていただけないでしょうか よろしくお願いします。

    • ベストアンサー
    • Java