2009-10-06 14 views
7

私たちはこれに対する答えをしばらく探していましたが、解決策が見つかりませんでした。ブラウザのダウンロード完了イベント

私たちには、動的に生成されサーブレットから提供されるファイル(pdfs)をダウンロードできるWebサーバーがあります。ダウンロードがいつ完了したのか(また、成功したかどうか、失敗したかどうか、ユーザーはキャンセルしたかどうか)を知りたい。

ユーザー入力なしでこれを知る方法はありますか?これらのファイルは比較的小さく、プログレスバーの機能は必要ありませんが、ダウンロードが完了したときに報告する何らかの「エンドフック」が必要です。これは可能ですか?

[編集]ブラウザ側で、ダウンロード終了を検出して、ajax経由でサーバに報告する機能はありますか?

答えて

3

ネットワークエラーが発生しない限り、わからないことがあります。唯一の方法は、ダウンロードが正常に完了したことを確認するために、ブラウザにAJAXを使用してサーバーに2番目のイベントを送信させることです。

+2

ダウンロードが正常に完了したかどうかはブラウザにどのように伝えられますか?それは実際に私の質問の要点でした、私はそれを明確にするために編集します – laura

+9

この回答はなぜ受け入れられましたか?私たちはまだブラウザがダウンロードが完了したことをブラウザがどのように知ることができるかわかりません – abyx

+0

laura、なぜあなたはこの答えを授かったのですか? ) – dnim

1

ServletResponsesetContentLengthメソッドを使用すると、ファイルが小さくても、ユーザーはエラーと正常なダウンロードを区別することができ、ブラウザのダウンロードマネージャーは完了時に通知します。

2

ユーザキャンセル可能時にはがサーブレットで検出される可能性があります。たとえば、Tomcatを使用して、大きなファイルをクライアントにストリーミングしてから、ダウンロードをキャンセルしてみてください。例外のスタックトレースはlogs/catalona.outに表示されます。しかし、これはサーブレット自体やより低いレベル(カタリナの中で)で処理できることはわかりません。

画像をダウンロードするために通常使用される事前ロード方法(イベントリスナファシリティを使用してください)があります。サポートされていない画像として検出された場合は、PDF全体をダウンロードするかどうかはブラウザによって異なりますが、試してみる価値はあります。 Hereがその一例です。

別の解決策は、<object>または<embed>タグを使用して暗黙的にPDFをダウンロードし、そのonloadイベントリスナーを使用することです。これは、ActiveXや何らかの種類のPDFファイルの関連付けがブラウザで行われている場合にのみ機能し、ユーザーがPDFビューアを持っていない場合はおそらく機能しません。これを実証する例はHereです(参考資料:11/21/04 08:22 AM、ID:12638846参照)。

モフセン

6

あなたは直接ブラウザ(TCP接続のエンドポイント)に接続されたサーバからかなり良いアイデアを得ることができます。ユーザーがダウンロードをキャンセルするか、ネットワークに問題が発生した場合、サーバーはIOエラーを受け取ります。したがって、サーバーを直接(プロキシなしで)実行することができれば。

ただし、正常にダウンロードした後にブラウザでPDFが表示されないことがあります。ブラウザからのACKは最善の方法でしょう。 PDFがブラウザーで直接表示されている場合は、これを行うことはできません。何らかの種類のJavascript PDFビューアを使用して、表示されたときにサーバーにコールバックを追加する必要があります。

1

ブラウザはネイティブにこれを処理しませんが、Googleのギアを使用してダウンロード要求を処理できます(ダウンロードが完了すると成功イベントが発生します)。

http://code.google.com/apis/gears/api_httprequest.html

0

あなたの文書に画像フィールドを挿入することができた場合は、画像のhrefは、ユーザーがPDFドキュメントを開いていることを確認するためにあなたのサーバーに戻って指すことができます。

私はこれを試していませんが、last page of this adobe docを見ていることは可能です。

イメージ・フィールドはサポートしていませんが、イメージ・フィールドを持つpdfテンプレートを使用してドキュメントを作成し、イメージ・フィールドにurlを割り当てるためのjavascriptを追加することができます。

関連する問題