- PR -

ファイルダウンロードと画面更新を同時に行う方法?

投稿者投稿内容
はやし
常連さん
会議室デビュー日: 2007/10/31
投稿数: 23
投稿日時: 2007-11-13 20:04
こんばんは、はやしです。

CGIで、画面上に表示されているアンカをクリックすると、違う画面に遷移し、
なおかつJavascriptでEXCELファイルをダウンロードする方法を探しています。

環境はWinXPでブラウザはIE6.0 SP2です。

"HTMLを表示させる"事と、"ファイルダウンロード"する事の両方を
一回のsubmitに対する処理で書いてみたところ、ファイルダウンロードは出来ましたが、画面遷移が出来ませんでした。(<−これは当然の結果なのでしょうか?)

また、以下のような記述だとネスケなら問題なく動くのですが、IEだと
マクロが2回起動してしまいます。しかも2回目は読み取り専用になっていました。

<script language="JavaScript">
window.document.location.href='http://window.location.host/macro/aaa.xls';
</script>

そして以下のようにダウンロードさせるようにしたところ、
今度は画面遷移が出来ません。

Content-type: application/octet-stream;
Content-Disposition: attachment; filename=aaa.xls;

何か違う方法があるのか、または一回で"画面遷移"と"ダウンロード"を
行う事がダメなら、一度画面遷移した先に、ダウンロード用のアンカなり、
ボタンなりをつくって、処理を分けなければいけないのでしょうか?

どうかご教授の程宜しくお願いします。

GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-11-13 21:29
引用:

はやしさんの書き込み (2007-11-13 20:04) より:
何か違う方法があるのか、または一回で"画面遷移"と"ダウンロード"を
行う事がダメなら、一度画面遷移した先に、ダウンロード用のアンカなり、
ボタンなりをつくって、処理を分けなければいけないのでしょうか?



JavaScriptではありませんが、METAでクライアント側からリダイレクトさせる方法ではいかがでしょう?

画面に表示したいHTMLの<head>に以下のようなタグを入れておくことにより、画面表示後、自動的に指定したURLに対してGET要求が発生します。
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://host/macro/aaa.xls">

ファイル保存のダイアログを出すのであれば、場合によりちょっと細工を(Content-typeの指定など)する必要があると思いますが、結果、画面表示とほぼ同時にファイルをダウンローしているように見えると思います。
はやし
常連さん
会議室デビュー日: 2007/10/31
投稿数: 23
投稿日時: 2007-11-13 23:58
GENZOさん、お返事ありがとうございます。

引用:

GENZOさんの書き込み (2007-11-13 21:29) より:
JavaScriptではありませんが、METAでクライアント側からリダイレクトさせる方法ではいかがでしょう?

画面に表示したいHTMLの<head>に以下のようなタグを入れておくことにより、画面表示後、自動的に指定したURLに対してGET要求が発生します。
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://host/macro/aaa.xls">



なるほど!明日早速試してみます。

引用:

GENZOさんの書き込み (2007-11-13 21:29) より:

ファイル保存のダイアログを出すのであれば、場合によりちょっと細工を(Content-typeの指定など)する必要があると思いますが、



これはファイル保存のダイアログを出す場合、
Content-type: application/octet-stream;だと問題があるという事でしょうか?



ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2007-11-14 00:08
Webアプリケーションってのは、基本的にRequestとそれに対するResponseで成り立っています。

別画面に遷移する、というのは、「別画面に遷移」というRequestに対して、別画面のHTMLがResponseとして帰ってくることです。

Content-typeを書き換えてExcelをダウンロードさせる、ということは、ResponseがまるごとExcelファイルになるので、HTMLとしてのResponseは帰ってきません。画面遷移ができないのはそのためです。

最も簡単な方法は、Excelダウンロード用の画面をwindow.openで開き、かつ親画面は別画面に遷移させる、という方法ですが、これだと真っ白い子画面が残ってしまいます。

それが嫌なら、発想を変えて、「画面遷移ができない」というのを逆に利用しましょう。つまり、遷移先画面のonloadで遷移先画面をダウンロード用のcgiに遷移させてやるのです。
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-11-14 00:16
引用:

はやしさんの書き込み (2007-11-13 23:58) より:
これはファイル保存のダイアログを出す場合、
Content-type: application/octet-stream;だと問題があるという事でしょうか?



いいえそれでOKです。というかそういう指定をする必要があるよということが言いたかっただけなんです。紛らわしかったですね。
はやし
常連さん
会議室デビュー日: 2007/10/31
投稿数: 23
投稿日時: 2007-11-14 00:24
ぼのぼのさん、お返事ありがとうございます。

引用:

ぼのぼのさんの書き込み (2007-11-14 00:08) より:
Content-typeを書き換えてExcelをダウンロードさせる、ということは、ResponseがまるごとExcelファイルになるので、HTMLとしてのResponseは帰ってきません。画面遷移ができないのはそのためです。


そういう事だったんですか、勉強になりました。

引用:

ぼのぼのさんの書き込み (2007-11-14 00:08) より:
遷移先画面のonloadで遷移先画面をダウンロード用のcgiに遷移させてやるのです。


つまりonloadイベントでjavascriptの関数に渡して、その中で
改めてsubmitさせるという認識で合ってますか?
これならうまくいきそうですね。
GENZOさんに教えて頂いた方法とぼのぼのさんに教えて頂いた方法、
明日両方試してみます。
ありがとうございます!
はやし
常連さん
会議室デビュー日: 2007/10/31
投稿数: 23
投稿日時: 2007-11-14 00:31
GENZOさん、お返事ありがとうございます。

GENZOさんに教えて頂いたことも、ぼのぼのさんに教えて頂いた事も
全く考えもつきませんでした。無知でしかも頭が堅すぎますね・・・。

明日、試してみてまた結果報告します。
ありがとうございました。
はやし
常連さん
会議室デビュー日: 2007/10/31
投稿数: 23
投稿日時: 2007-11-14 11:45
問題が8割くらい解決しました。

引用:

ぼのぼのさんの書き込み (2007-11-14 00:08) より:
遷移先画面のonloadで遷移先画面をダウンロード用のcgiに遷移させてやるのです。



ぼのぼのさんに教えて頂いた方法を試してみたところ、画面の上に
「セキュリティ保護のため、このサイトによる、このコンピュータへのファイルの
ダウンロードがInternet Explorerによりブロックされました。
オプションを表示するには、ここをクリックしてください」という情報バーが
出て、これを許可しないとダウンロードのダイアログが表示出来ません。

どのようにすれば、ブロックしないように出来ますか?
インタネットオプションの設定とかではなく、プログラム内部でやりたいです。

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