[Seasar-user:10635] Re: ダウンロードを IE でキャンセルした際の対応について

Shinpei Ohtani [E-MAIL ADDRESS DELETED]
2007年 9月 19日 (水) 15:41:49 JST


大谷です.

ユーザキャンセル時に対してUtilを準備しました.
teedaCustomize.diconに宣言的にユーザキャンセルとみなす
例外を指定します.

<component class="org.seasar.teeda.core.util.DefaultCancelHandler">
		<initMethod name="addCancellableException">
			<arg>@[E-MAIL ADDRESS DELETED]</arg>
		</initMethod>
</component>

キャンセルかどうかの判定にはorg.seasar.teeda.core.util.CancelUtilを
使います.Teedaに依存するのが嫌であれば、適当なコンポーネントを作ってください.
またはCancelHandlerそのものをPageにDIしてもかまいません.
(今後準備する予定はあります)

ダウンロードのロジックは例えば下記のようになります.

OutputStream os = null;
try {
	os = response.getOutputStream();
	os.write(FileUtil.getBytes(file));
} catch (IOException e) {
	Throwable cause = e.getCause();
	if (!CancelUtil.isCancelled(cause)) {
		throw new AppFacesException("E0000002");
	} else {
		System.out.println("user cancelled....");
	}
} finally {
	try {
		os.close();
	} catch (final IOException e) {
	}
}
this.facesContext.responseComplete();

必要最低限な感じですが、ひとまずこのようにしました.
宜しくお願いします.


07/09/19 に Shinpei Ohtani<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 大谷です.
>
> サンプルありがとうございます.
> こちらでも再現しました.
> どうやらTomahawkのFilterかましていたので
> そこでバッファリングされていたようです.
>
> 下記サンプルも踏まえ、対応を検討してみます.
> 宜しくお願いします.
>
> 07/09/19 に [E-MAIL ADDRESS DELETED]<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > お世話になっております。TuMikiです。
> >
> > サンプルを作成しましたので、送ります。
> > これに、ダウンロード用のファイルを6Mbyteとかのサイズのファイルで実行して、
> > キャンセルすれば発生しました。(Tomcatは5.5.23です)
> > ただ、このサンプルだと、エラーダンプは出るのですが、エラー画面へ遷移しません。
> > 対象がTeeda1.0.7でサンプルの実行がTeeda1.0.11RC1でバージョンの差異なのか、
> > こちらでの作りこみなのかは未調査です。
> >
> > なお、ThrowsInterceptorで対応しようとしたのですが、customizer.diconのpageやact
> > ion部分に追加しても
> > SocketExceptionやorg.seasar.framework.exception.InvocationTargetRuntimeExcepti
> > onを引っ掛けることはできませんでした。もう少し外側で引っ掛ける方法などありまし
> > たら、ご教授いただければ助かります。
> >
> > よろしくお願いいたします。
> > ----- Original Message -----
> > >Date: Mon, 17 Sep 2007 15:17:30 +0900
> > >From: "Shinpei Ohtani" <[E-MAIL ADDRESS DELETED]>
> > >To: [E-MAIL ADDRESS DELETED]
> > >Subject: [Seasar-user:10567] Re:
> > >       ダウンロードを IE でキャンセルした際の対応について
> > >
> > >
> > >大谷です.
> > >
> > >いま、軽く試しているのですが、
> > >大体どれくらいのサイズだと発生しますか?
> > >
> > >こちらで試していてもなかなかでないので.
> > >もし再現ケース等があるなら、頂けると助かります.
> > >
> > >07/09/17 に TuMiki<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > >> お世話になっています。TuMikiです。
> > >>
> > >> あら、なんと。
> > >>
> > >> でも、正しくはって言うのも変だけど、
> > >> 今回、そのまま、AP担当のURLにリダイレクトしちゃったけど、
> > >> でかいファイルの場合は、Apacheとかの機能で対応するのは本筋なのかも。
> > >> HTTPサーバーの変更まで手が回らないんで、ご迷惑をおかけしますです。
> > >>
> > >> よろしくお願いします。
> > >> 以上
> > >>
> > >> Shinpei Ohtani さんは書きました:
> > >> > 大谷です.
> > >> >
> > >> > こちらの件、Teeda側でも検討します.
> > >> > サイズの大きいファイルを扱うときに、普通に出そうなので.
> > >> >
> > >> > 宜しくお願いします.
> > >> >
> > >> > 07/09/13 に [E-MAIL ADDRESS DELETED]<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > >> >> お疲れ様です。TuMikiです。
> > >> >>
> > >> >> closeをはずしてみましたが、現象は同じでした。
> > >> >>
> > >> >> Maenoさんのご指摘のように
> > >> >> ThrowsInterceptorを作成して、java.net.SocketExceptionを無視する方向を検
> > 討して
> > >> >> みます。
> > >> >> 以上
> > >> >>
> > >> >> ----- Original Message -----
> > >> >>> Date: Thu, 13 Sep 2007 20:28:40 +0900
> > >> >>> From: SETO Azusa <[E-MAIL ADDRESS DELETED]>
> > >> >>> To: [E-MAIL ADDRESS DELETED]
> > >> >>> Subject: [Seasar-user:10509] Re:
> > >> >>> ダウンロードを IE でキャンセルした際の対応について
> > >> >>>
> > >> >>>
> > >> >>> せとあずさです。
> > >> >>>
> > >> >>> On Thu, 13 Sep 2007 10:59:11 +0900 (JST)
> > >> >>> [E-MAIL ADDRESS DELETED] wrote:
> > >> >>>
> > >> >>>> CSVファイルのダウンロードは、Actionクラスで
> > >> >>>>      public Class doHoge() {
> > >> >>>>              // レスポンスにダウンロード用のヘッダー設定を行い
> > >> >>>>              response.setContentLength((int) size);
> > >> >>>>              response.setContentType("text/csv");
> > >> >>>>              response.setHeader("Content-Disposition","inline;filename
> > =\"" + fileName
> > >> >> + "
> > >> >>>> \"");
> > >> >>>>
> > >> >>>>              //内容を書き出して
> > >> >>>>              OutputStream out = response.getOutputStream();
> > >> >>>>              int c;
> > >> >>>>              while ((c = in.read()) != -1) {
> > >> >>>>                      out.write(c);
> > >> >>>>              }
> > >> >>>>              out.close();
> > >> >>>>              in.close();
> > >> >>>>              // 終了したことをJSFに通知する。
> > >> >>>>              page.getFacesContext().responseComplete();
> > >> >>>>              return null;
> > >> >>>>      }
> > >> >>>> として実現しています。
> > >> >>>> ログを見る限りは、Actionクラス終了後の出来事のようなのです。
> > >> >>>> 「ClientAbortException」を無視するような対応が必要だと思うのですが・・
> > ・
> > >> >>> Actionの中でOutputStreamをcloseしているのが不要なのでしょう。
> > >> >>> Teedaに限らずServletでは、Responseから取得したOutputStreamの
> > >> >>> closeはWebコンテナ(Servletコンテナ)の役割です。
> > >> >>>
> > >> >>> # と、思います。
> > >> >>>
> > >> >>>
> > >> >>> --
> > >> >>> せとあずさ
> > >> >>> [E-MAIL ADDRESS DELETED]
> > >> >>> http://www.fieldnotes.jp/d/
> > >> >>> _______________________________________________
> > >> >>> Seasar-user mailing list
> > >> >>> [E-MAIL ADDRESS DELETED]
> > >> >>> https://ml.seasar.org/mailman/listinfo/seasar-user
> > >> >> _______________________________________________
> > >> >> Seasar-user mailing list
> > >> >> [E-MAIL ADDRESS DELETED]
> > >> >> https://ml.seasar.org/mailman/listinfo/seasar-user
> > >> >>
> > >> >
> > >> >
> > >> _______________________________________________
> > >> Seasar-user mailing list
> > >> [E-MAIL ADDRESS DELETED]
> > >> https://ml.seasar.org/mailman/listinfo/seasar-user
> > >>
> > >
> > >
> > >--
> > >=============================
> > >Shinpei Ohtani
> > >[E-MAIL ADDRESS DELETED]
> > >=============================
> > >_______________________________________________
> > >Seasar-user mailing list
> > >[E-MAIL ADDRESS DELETED]
> > >https://ml.seasar.org/mailman/listinfo/seasar-user
> >
> > _______________________________________________
> > Seasar-user mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> >
> >
> >
>
>
> --
> =============================
> Shinpei Ohtani
> [E-MAIL ADDRESS DELETED]
> =============================
>


-- 
=============================
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
=============================



Seasar-user メーリングリストの案内