- PR -

ファイルのダウンロード完了を検知後、遷移させたい

投稿者投稿内容
jazz
会議室デビュー日: 2007/03/05
投稿数: 4
投稿日時: 2007-03-05 23:55
はじめまして、いつもこちらの会議室を参考にさせていただいている者です。

現在開発している機能で行き詰っている部分があるのでご教授お願いしたいと思い、
スレッドの方を立てさせてもらいました。

標題からお解りいただけると思いますが、ファイルのダウンロードをさせる機能があります。
やろうとしている事の流れは、順に以下の3項になります。
1.ユーザがダウンロードボタンを押下するとダウンロードダイアログが開く
2.ユーザが保存を選択した場合にサーバからデータの送出しが開始する。
  キャンセルが選択された場合は自画面のままにする。
3.サーバの送出しが完了されたら次画面に遷移する。(ダウンロード完了画面)

2のサーバの送出しはFileInputStreamでファイルを読み込みreadしたものをレスポンスにwriteし、出力することでダウンロードダイアログを出しています。
全てwriteした後にcloseまで行ったらサーバの送出しが完了したという事になると思うので、
ここで次画面に遷移したいのですが、次画面のアクションを指定してもなぜか遷移できませんでした。

色々と自分で調べてみると一回のリクエストが送出された場合は
同じ処理内(?)でもう1度リクエストを送ることができないとの事でした。
今回で言うダウンロードのリクエスト後に遷移できないというのはこういった理由だと思われます。
しかし、これに対する有用な策がなかなか見つからずどうしていいか困っています。
1回のリクエストでダウンロードと完了後に遷移をさせる事ができるのでしょうか?

こういった事を経験の方がいらっしゃるならば、お力お貸しいただけたらと思います。
宜しくお願い致します。

開発環境:
s2struts
tomcat
jdk1.4.2
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-03-06 00:23
ダウンロードボタンが押されたら、JavaScriptなりtarget指定なりで、
ファイルダウンロード専用に別ブラウザを表示させて、親ブラウザ側
は涼しい顔をして次画面に遷移させるという、ありがちな処理ではだ
めでしょうかね。
サーバからダウンロードするデータを全て送信し終わっても、クライ
アントが正しくダウンロードできたことにはならないので、送信終了
をもって、ダウンロード完了画面を表示するのはいかがなものかとも
思うのですが。


[ メッセージ編集済み 編集者: 小僧 編集日時 2007-03-06 00:24 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-03-06 00:56
ちょっと前に同じような質問に答えた記憶があります。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36426&forum=12
jazz
会議室デビュー日: 2007/03/05
投稿数: 4
投稿日時: 2007-03-06 11:16
お忙しい中レスして頂きありがとうございます。

小僧さん>
引用:

ダウンロードボタンが押されたら、JavaScriptなりtarget指定なりで、
ファイルダウンロード専用に別ブラウザを表示させて、親ブラウザ側
は涼しい顔をして次画面に遷移させるという、ありがちな処理ではだ
めでしょうかね。



早速上記の方法を試してみました。空白のウィンドウが開くのもアレなので
サイズ0の見えないフレームを作りtarget指定をし、そこにPOSTするようにしました。
POSTするとアクションが動いてダウンロードのダイアログが開きますが、
遷移してくれませんでした。
別ウィンドウに対してのリクエストと親ウィンドウの遷移関してもう少し調べてみたいと思います。


引用:

サーバからダウンロードするデータを全て送信し終わっても、クライ
アントが正しくダウンロードできたことにはならないので、送信終了
をもって、ダウンロード完了画面を表示するのはいかがなものかとも
思うのですが。



確かに自分も思いました。
しかし、ローカルにデータの欠損無く保存されたかどうかを取得するには
サーブレットだけでは無理な気がしたので・・・。
なので今回はサーバ側からの送出が完了した場合をダウンロード完了とすることに決めたのです。

あしゅさん>
引用:

ちょっと前に同じような質問に答えた記憶があります。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36426&forum=12


当会議室の過去ログはサラっと見てみたのですが、
そのスレッドは見た覚えがありませんでした。ご指摘ありがとうございます。

やろうとしている事は非常に似ていると思います。
私もダウンロードの完了は検知できる状況・環境が限られていると考えています。
そこで考えた末にサーバのデータ送出の完了なら分かると思い、今回の方法を試みています。

もしあしゅさんが、このような機能を実現しようとした時にどの様な方法をとりますか?
よろしければ、お知恵の方お貸しいただけたら、とおもいます。



# JavaScriptには詳しくないのですが、xmlhttpRequestの非同期通信を使ってサーバとクライアントとの
# やり取りをチェックできたりしませんか?例えばですが、ダウンロード開始後に一定間隔でチェック
# できれば理想通りいきそうだと思うのですが・・・。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-03-06 13:23
コネクションをたくさん使っていいなら、
1.ダウンロードを行う
2.同時にXHRで接続を張りに行く
3.2のリクエストに対してレスポンスを返さずに待ちを行う
4.ダウンロードが完了したら3の待ちを解放する
5.2のリクエストで4によってブラウザにレスポンスが返るので画面遷移
って感じでできなくはありませんが、非常にトリッキーです。
1と2が同じクライアントであるかの確認はセッションでできると思います。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-03-06 14:01
引用:

jazzさんの書き込み (2007-03-06 11:16) より:
やろうとしている事は非常に似ていると思います。
私もダウンロードの完了は検知できる状況・環境が限られていると考えています。
そこで考えた末にサーバのデータ送出の完了なら分かると思い、今回の方法を試みています。

もしあしゅさんが、このような機能を実現しようとした時にどの様な方法をとりますか?
よろしければ、お知恵の方お貸しいただけたら、とおもいます。



私ならば、トリッキーな方法で対処しようとすると、
いつか悲惨な目に遭うので仕様的に回避しようとします。

例えば、ブラウザに慣れたユーザーならば、ダウンロードを行った後に
自分の操作で別の画面に進むことが一般的だと知っているでしょうし、
ユーザーがダウンロードを完了したことを100%検知する事は不可能なので、
ダウンロード済みフラグは立てるにしても、再ダウンロード可能にします。

それを知った上でどうしても、というのであれば、
かつのりさんと似たような方法を選ぶと思います。

Ajax的な手法かどうかに関わらず、ポーリングでしょう。
jazz
会議室デビュー日: 2007/03/05
投稿数: 4
投稿日時: 2007-03-06 20:42
レスありがとうございます。

かつのりさん>
引用:

かつのりさんの書き込み(2007-03-06 13:23)より:
コネクションをたくさん使っていいなら、
1.ダウンロードを行う
2.同時にXHRで接続を張りに行く
3.2のリクエストに対してレスポンスを返さずに待ちを行う
4.ダウンロードが完了したら3の待ちを解放する
5.2のリクエストで4によってブラウザにレスポンスが返るので画面遷移
って感じでできなくはありませんが、非常にトリッキーです。
1と2が同じクライアントであるかの確認はセッションでできると思います。



コネクション数に関しては多くても構わないと考えています。
xmlHttpRequestでもいけそうな感じですね。
少しわからない部分があるので質問させてください。
Java⇔JavaScriptという部分が頭の中で繋がらなく、想像つきませんでした。
上記のかつのりさんのフローを参考に、webで検索しつつプログラムの方を書いてみましたが、
JavaでReadしたファイルとの接続をJavaScriptはどうやって知る事ができるのかという所でつまづいてしまいました。

↑の書き方で理解しにくいと思いますので具体的に例を挙げますと、
ダウンロードボタンが押下された時にその画面のアクションとJavaScriptの処理を同時に走らせると思います。
Java側でhoge.exeをreadし、レスポンスに対してwriteしますがそれが完了したのをどうやってJavaScriptで拾うのか、というところです。
フラグを渡そうにもJava⇔JavaScriptでは渡せませんよね…?

検索しても似たような例がなかなか無かったので実際書いてみたのですがわからなかったのでどうかアドバイスを下さい。
今までの説明で分からないことがあればなんでも聞いてください。
宜しくお願いします。


あしゅさん>
引用:

私ならば、トリッキーな方法で対処しようとすると、
いつか悲惨な目に遭うので仕様的に回避しようとします。



確かにトリッキーな方法で対処していると、あとで泣きをみる事もありますね〜。
仕様の時点で回避できれば何の問題もないですしね…。

引用:

例えば、ブラウザに慣れたユーザーならば、ダウンロードを行った後に
自分の操作で別の画面に進むことが一般的だと知っているでしょうし、
ユーザーがダウンロードを完了したことを100%検知する事は不可能なので、
ダウンロード済みフラグは立てるにしても、再ダウンロード可能にします。



今回の場合、「再ダウンロードはn回まで」という仕様でやる予定なので難しいところです。
あしゅさんの仰られる通り、100%の検知はまず無理ですね(^^;

引用:

それを知った上でどうしても、というのであれば、
かつのりさんと似たような方法を選ぶと思います。

Ajax的な手法かどうかに関わらず、ポーリングでしょう。



なるほど。こういった手法をとるのはトリッキーではありますが、
その中でもまだスマートにできそうな気がしますね。
ポーリングというのが解っていないのでいまから調べてみようと思います!
アドバイスどうもありがとうございます。


# 後学の為にも皆さんの厳しいツッコミ募集中です。。。(^^;
# 引き続き、宜しくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-06 22:04
アップロード中のプログレスバーであれば、 YouSendItとかでやっていますね。
・「ダウンロード中です」画面に遷移
・setTimeout() で定期的に送信状況をポーリング
・完了したら画面遷移
といった雰囲気でしょうか。
まず試してみてください。

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