dポイントプレゼントキャンペーン実施中!

お世話になっております。

【環境】
ASP.NET(VB)
IIS

【質問】
ボタン押下時に2つの異なる帳票(A帳票.xls、B帳票.xls)を作成し、別々にダウンロード処理をさせたいのですが、上記2帳票を別々にダウンロードさせるための実装方法がわかりません。
1つの帳票でしたら、下記の実装方法でダウンロードをすることが確認できました。

Response.Clear()
Response.ContentType = "application/vnd.ms-excel"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=A帳票.xls")
Response.WriteFile("D:\temp/A帳票.xls")

どなたかご存知の方がいらっしゃれば、ご教授ください。
よろしくお願いいたします。

A 回答 (3件)

>Response.ClearContent()なのですが、A/B各帳票出力前に行っています。

参考URLでは、ClearContentからCloseまでを1セットとしてまわしているようでしたので、以下のような実装としました。

私もできるんじゃないかと思って最初アドバイスしてましたが、よくよく考えると、一度、HTTPヘッダを設定した場合、その後のヘッダは無視されますね。

そうなると、ContentTypeには、multipart/mixed をセットした処理を実装する他ありません。

ただし、multipart/mixedは、ブラウザに依存する上に、IEやFireFoxで動く保障がありませんし、また、"application/vnd.ms-excel"のContextTypeを使っている以上、複数ファイルの同時ダウンロードは、HTTPの要件とブラウザの仕様でできないというのが回答になります。
そこは、HTTPの要件がもうそうなってしまっているので私たちの力ではどうにもできないということですね。

http://sonic64.com/2003-11-11.html

ということで、当初お話した、

「ダウンロードする際、JavaScriptなどを使って、2種類のWindowを開き(window.open)、1つはA帳票.xls、もう1つはB帳票用にaspxを分けてダウンロード処理を実装する」

これしか方法論はありません。
また、もっと携わられているWebサイトやWebシステムの機能仕様面をご自身や担当SEなどに相談し見直されることをお勧めします。

宜しくお願いします。

参考URL:http://sonic64.com/2003-11-11.html
    • good
    • 0
この回答へのお礼

kero-mio様
やはり、window.openを使うより他なさそうですね。
貴重なお時間を割いていただきありがとうございました。

お礼日時:2008/08/29 17:38

私がアドバイスしたResponse.ClearContent() をいれてないみたいですが、なぜでしょうか?


私も現在ASP.NETを動かせる動作環境を持っていないため、感覚で申し上げていて大変恐縮なのですが、Response.ClearContent()を使わずに
ヘッダをセットを2回書いた理由をお聞かせ下さい。

この回答への補足

ご回答ありがとうございます。kero-mio様のおっしゃっていたResponse.ClearContent()なのですが、A/B各帳票出力前に行っています。参考URLでは、ClearContentからCloseまでを1セットとしてまわしているようでしたので、以下のような実装としました。

' A帳票
Response.ClearContent() '←ここで初期クリア
Response.ContentType = "application/vnd.ms-excel"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=A帳票.xls")
Response.WriteFile("D:\temp/A帳票.xls")

' クライアントへすべて書き出し
Response.Flush()
Response.Close()

' B帳票
Response.ClearContent() '←ここで2回目クリア
Response.ContentType = "application/vnd.ms-excel"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=B帳票.xls")
Response.WriteFile("D:\temp/B帳票.xls")

' クライアントへすべて書き出し
Response.Flush()
Response.Close()

補足日時:2008/08/22 16:08
    • good
    • 0

ブラウザによっては、multipart/x-mixed-replace を


ContextTypeに指定し、Response.AddHeaderをそれぞれのファイル名で
1回ずつ呼んであれば、複数ファイルの同時ダウンロードができる
ブラウザもあります。

なので、結論としては、ダウンロードする際、JavaScriptなどを使って、2種類のWindowを開き(window.open)、1つはA帳票.xls、もう1つはB帳票用にaspxを分けてダウンロード処理を実装するしかないように思います。

後はどうしても、JavaScriptなどクライアント側の制御をしたくないという場合は、上記の処理をA帳票、B帳票と2回実行してもいいと思います。

' A帳票
Response.ContentType = "application/vnd.ms-excel"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=A帳票.xls")
Response.WriteFile("D:\temp/A帳票.xls")

' A帳票を指示したら、今度はB帳票を出す準備のため、いったんクリア
Response.ClearContent()

' B帳票
Response.ContentType = "application/vnd.ms-excel"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=A帳票.xls")
Response.WriteFile("D:\temp/B帳票.xls")

' クライアントへすべて書き出し
Response.Flush()
Response.Close()

これしか方法がないように思います。
(ただ、上記コードはまったく動作確認をしてないので動かないかもしれませんが、感覚だけでもつかんで頂ければ・・・)
宜しくお願いします。

参考URL:http://www.eggheadcafe.com/community/aspnet/2/10 …

この回答への補足

kero-mio様、早速の回答ありがとうございます。

現状、ご教授いただいた下記の方法では実装ができているのですが、ダウンロードの際に小窓が出てしまって余り見栄えがよくありません。

>結論としては、ダウンロードする際、JavaScriptなどを使って、2種類のWindowを開き(window.open)、1つはA帳票.xls、もう1つはB帳票用にaspxを分けてダウンロード処理を実装するしかないように思います。

A帳票、B帳票と2回実行する方法について実装してみました。
kero-mio様の回答と、参考URLをもとに、下記のようにコーディングをしてみたのですが複数でダウンロードダイアログが出ませんでした。
ひとつのブラウザに複数のヘッダをセットするあたりがいまいち、ピンとこない感じです。

' A帳票
Response.ClearContent()
Response.ContentType = "application/vnd.ms-excel"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=A帳票.xls")
Response.WriteFile("D:\temp/A帳票.xls")

' クライアントへすべて書き出し
Response.Flush()
Response.Close()

' B帳票
Response.ClearContent()
Response.ContentType = "application/vnd.ms-excel"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=B帳票.xls")
Response.WriteFile("D:\temp/B帳票.xls")

' クライアントへすべて書き出し
Response.Flush()
Response.Close()

引き続き調査・実装中ですが、取り急ぎ経過報告まで。

補足日時:2008/08/22 14:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています