- PR -

ファイルのダウンロード時に、キャンセルのイベントがとりたい。

1
投稿者投稿内容
のり
会議室デビュー日: 2005/11/02
投稿数: 1
投稿日時: 2005-11-02 08:40
こんにちは。
初めて質問させていただきます。

HTTPの機能を使ってサーブレットでPDFファイルのダウンロードを行う処理を実装しています。

クライアントがダウンロードのダイアログでキャンセルボタンを押したときのイベントを
サーブレット側で検知し、キャンセルされた場合にはDBへの登録をしようとしています。

そこで、以下のように
入力ストリームからファイルを読み込むときと
出力ストリームに書き込むときのバイト数を1バイトずつに設定すると、
300KB以上のPDFファイルの場合は「キャンセル」ボタンを押したときにも
IOExceptionでステータスをcatchすることができます。


File file = new File(srcDir, filename);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis, 1024);
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream(), 1024);

byte[] byteBuf = new byte[1];
int binData = 0;
for (; {
binData = bis.read(byteBuf, 0, byteBuf.length);
if (binData < 0) {
break;
}
bos.write(byteBuf, 0, binData);
}

しかし、いろいろ試してみても以下のような場合にIOExceptionのステータスのcatchができません。

(1)PDFファイルのサイズが300KB以下で、
 「ファイルのダウンロード」ダイアログの「保存」ボタンを押した後の「名前を付けて保存」ダイアログ
 で「キャンセル」ボタンを押したとき。

(2)PDFファイルのサイズが100KB以下で、
 「ファイルのダウンロード」ダイアログの「キャンセル」ボタンを押したとき。

という事なのですが、
これらの場合のキャンセルのイベントを取るための解決策や手がかりなどが
ありましたらご教授いただけませんでしょうか?
よろしくお願いいたします。
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-11-02 09:50
おはようございます。

引用:

のりさんの書き込み (2005-11-02 08:40) より:
(1)PDFファイルのサイズが300KB以下で、
 「ファイルのダウンロード」ダイアログの「保存」ボタンを押した後の「名前を付けて保存」ダイアログ
 で「キャンセル」ボタンを押したとき。

(2)PDFファイルのサイズが100KB以下で、
 「ファイルのダウンロード」ダイアログの「キャンセル」ボタンを押したとき。

という事なのですが、
これらの場合のキャンセルのイベントを取るための解決策や手がかりなどが
ありましたらご教授いただけませんでしょうか?
よろしくお願いいたします。


あいまいな記憶ですが、参考までに。

まず、(1).については「名前を付けて保存」のダイアログが表示された時点で、
テンポラリへのダウンロードが完了している状態になっているかと思います。(IE)
ダウンロード時にどのような挙動を取るかはブラウザ実装依存の問題となってきま
すが、IEに関してはActiveXなどを使用しない限り検知出来ません。

(2).については微妙ですが、キャンセルボタンが押される前の段階で、サーバサイ
ドではレスポンスがコミットされた状態となっているのでしょう。

いずれにせよ、キャンセルされたかどうかを完全に検知することは通常のHTTPの仕
組みだけでは実現不可能です。IOExceptionのcatchによるキャンセル検知は大きな
ファイルのダウンロード時、かつ誤差が許容される要件でのみ使用しましょう。
1

スキルアップ/キャリアアップ(JOB@IT)