- PR -

複数ファイルのダウンロードについて

投稿者投稿内容
rviper
常連さん
会議室デビュー日: 2004/06/15
投稿数: 34
投稿日時: 2005-01-06 15:02
おせわになっております。

サーバ側でzip圧縮したファイルをクライアントにダウンロードさせる処理を
作成しています。ダウンロードするファイルが複数の場合、JSP内でダウンロード用サーブレットを何度も呼び出して複数のファイルをダウンロードしているのですが、
ダウンロードするファイルの数だけブラウザが起動してしまい、保存ダイアログを
閉じてもブラウザが閉じません。保存ダイアログで保存またはキャンセルした場合に、
ブラウザも同時に閉じたいのですが、方法はあるのでしょうか?
ちなみにダウンロードするファイルが1つのみの場合は、targetを_selfまたは_topに
指定すれば、保存ダイアログのみ表示され、特に問題はありませんでした。
何かご存知の方がいらっしゃいましたら宜しくお願い致します。
rviper
常連さん
会議室デビュー日: 2004/06/15
投稿数: 34
投稿日時: 2005-01-06 15:20
自己レスです。

動作の流れですが、以下の通りとなります。

1.圧縮する日付を複数選択
2.servletで圧縮してzipファイルを作成
3.zipファイル名をsessionに登録
4.JSPでzipファイル名をsessionから取得
5.取得したzipファイル名をJavaScript内でダウンロード用サーブレットの
  引数として設定して、submit
6.ダウンロード用サーブレット内では、パラメタで渡されたファイルを開いて、
  ServletStreamに書き込む

以上の流れとなります。

ファイルが1つだけの場合は、5でsubmitする前にtargetに"_top"または"_self"に指定しておけば、ブラウザが表示されずにファイル保存ダイアログが表示されます。
複数ファイルでtargetに"_top"または"_self"を指定すると最後のファイルだけダウンロードされてしまうので、targetはそれぞれ別な名前にするなどしています。
rviper
常連さん
会議室デビュー日: 2004/06/15
投稿数: 34
投稿日時: 2005-01-06 15:40
さらに自己レスです。

余計に分かりにくくしてしまっているようなので簡単に書くと
ファイル保存時に元画面を閉じたいということです。
過去スレを検索してみるとファイル保存時に元画面が閉じてしまうというのは
あったのですが、この逆で複数ファイルをダウンロードするので必ず元画面を
閉じるようにしたいのです・・・
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-01-06 15:51
引用:

ファイルが1つだけの場合は、5でsubmitする前にtargetに"_top"または"_self"に指定しておけば、ブラウザが表示されずにファイル保存ダイアログが表示されます。
複数ファイルでtargetに"_top"または"_self"を指定すると最後のファイルだけダウンロードされてしまうので、targetはそれぞれ別な名前にするなどしています。



「元画面を閉じたい」という要求とはちょっと違って、「余分なものを開かない」というイメージですが……
「それぞれ別な名前」として使っているものを、あらかじめサイズ0のフレーム等としてページ内部に全て用意しておけばうまくいきませんか?
rviper
常連さん
会議室デビュー日: 2004/06/15
投稿数: 34
投稿日時: 2005-01-06 16:08
回答ありがとうございます。

元画面を閉じることばかり考えていました・・・・

仰る通り、高さ、幅が0なframeのsrcとしてダウンロード用サーブレットを
呼び出したら上手く行きました!
ありがとうございました。
キルシェ
常連さん
会議室デビュー日: 2004/03/25
投稿数: 26
投稿日時: 2005-01-09 19:37
もしよろしければ、動作環境をお教え願えませんでしょうか。

複数ファイルの同時ダウンロードを行いたいということで、同様に
フレームのソースを使って実現していましたが、
WindowsXpSp1までは複数ダウンロードできるのですが、WindowsXpSp2では
ダウンロードできない(一つ目のファイルはダウンロード確認の
ダイアログが出てダウンロードできるのですが、二つ目以降の
ダウンロード確認ダイアログが表示されない)ので、結局実現を
断念したことがあります。

そのときは、動作確認の結果から判断してあきらめていましたが、
もしWindowsXpSp2でも実現できるという裏づけが取れれば、
調査・対応したいと考えていますので。
#実際はできるので調査してくださいになってしまいますが(^_^;;
rviper
常連さん
会議室デビュー日: 2004/06/15
投稿数: 34
投稿日時: 2005-01-24 14:39
亀レスですが、自己レスです。

>もしよろしければ、動作環境をお教え願えませんでしょうか。

環境的には、以下の通りです。
webサーバ、Servletエンジン:ZeusWebサーバ、WebLogic6.2SP2
クライアント:WindowsXP SP1+IE6.0

>複数ファイルの同時ダウンロードを行いたいということで、同様に
>フレームのソースを使って実現していましたが、
>WindowsXpSp1までは複数ダウンロードできるのですが、WindowsXpSp2では
>ダウンロードできない(一つ目のファイルはダウンロード確認の
>ダイアログが出てダウンロードできるのですが、二つ目以降の
>ダウンロード確認ダイアログが表示されない)ので、結局実現を
>断念したことがあります。

WindowsXPをSP2に更新したら同じ現象になりました。
色々調査したところ、IEの脆弱性による問題で、IFRAMEを利用して
多数のファイルをダウンロードできないようになったらしいです。
(http://www.atmarkit.co.jp/fwin2k/hotfix/ms03-020/ms03-020.html)

但し、IFRAMEを利用した場合だけみたいですので、さらに方法が無いか調査したところ
以下の方法で実現できました。

高さ、幅1の別windowを開きそのソースにJSPを指定し、パラメータとして
ファイル名を設定してみました。


<%
String fname = (String)request.getParameter("FILE");
%>
<html>
<head>
</head>
<body>
<% if( fname != null && !fname.equals("") ) { %>
<iframe id='DOWNLOAD' marginheight=0 height=0 width=0 marginwidth=0 frameborder=0 src='<%="/DownLoad?FILE="+fname%>'>
</iframe>
<% } else { %>
<script language="JavaScript">
window.close();
</script>
<% } %>
</body>
</html>

上記のようにさらにJSP内で高さ、幅0のIFRAMEからダウンロードを行うサーブレットを
呼び出すように変更してみたところ、上手く行きました。
ちなみに<meta http-equiv="refresh" でもやってみましたが、
保存後も画面が残ってしまうのでこの方法で行いました。

尚、ダウンロードを行うサーブレットの処理内容ですが、
ファイルを開いて内容をout.printしているだけです(;´Д`)

参考になるのでしょうか・・・
キルシェ
常連さん
会議室デビュー日: 2004/03/25
投稿数: 26
投稿日時: 2005-01-25 23:41
回答ありがとうございます。
理由と回避のコードまで提示いただいて、大変助かります。

提示のリンクを見ると、フレームを使用するからNGということの様ですね。
ところで、Sp2の場合は、最初にrviperさんが試されているコード
(ウィンドウをたくさん開く方法?)だと、実はうまくいったりしないでしょうか?
#Sp2では新しいウィンドウを開いてダウンロードダイアログが表示された
#場合は、その新しいウィンドウは閉じれくれたと記憶しています。

USER-AGENT名でSPの適用具合まで判別できるかどうかは分かりませんが、
ブラウザやOSのバージョンによって挙動が異なると、対応するほうは非常に
困りますね。
#対応しない・・・ってわけにはいかないし・・・。

ともあれ、詳しい情報をありがとうございました/

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