none
ASP.NET ファイルダウンロード時の挙動 RRS feed

  • 質問

  • 初めまして。
    初投稿なので、至らない点などありましたらご指摘よろしくお願いいたします。


    ■問題
    AsyncFileUploadの処理を実行後に、ファイルのダウンロード処理を行うと、同じURLのページが別ウィンドウで表示された上で、ファイルのダウンロードダイアログが表示されます。
    ※ファイルのアップロード・ダウンロード共に問題無く可能
    ※ダウンロード後は、展開された別ウィンドウは消えます。

    ■経緯・現状など
    現在、ASP.NET(C#)でファイルのダウンロード処理を行っています。
    当画面は、モーダルダイアログ(showModalDialog)で展開しています。
    当ダイアログでは、ファイルのダウンロード・アップロードの機能を実装しております。
    ・ダウンロード:Response.End()
    ・アップロード:AsyncFileUpload

    以下サイトの情報により、iframeを利用してフレーム分割を施すことにより、画面展開直後は問題なくファイルをダウンロードすることができました。
    サイト:http://d.hatena.ne.jp/kiyokura/20081007/p1

    しかし、画面展開直後、AsyncFileUploadの処理を通した後にダウンロード処理を実行すると、フレーム分割前と同様に同じ画面が別ウィンドウで表示されてしまいます。

    同じ画面がでないようにダウンロードする方法はないのでしょうか。

    ■ツールなど
    VisualStudio2010
    ASP.NET3.5
    Ajax3.5.4

    IE8

    • 編集済み kaijin22 2012年5月16日 8:33
    2012年5月16日 8:27

回答

  • 質問文からの想像ですが、AsyncFileUploadの戻り値としてダウンロードデータを送信していますか?

    切り分けというのはそういう組み合わせ部分を分解し、AsyncFileUpload / ファイルダウンロード / showModalDialog のどこに問題があるのか、単独で問題がなければ何と何を組み合わせたときに問題が発生するのか。そういう原因を探ることです。

    原因は判明していませんが、とりあえずの提案としては、AsyncFileUploadの完了をブラウザー側で検出したら改めてダウンロードページにジャンプするとかどうでしょう?

    • 回答としてマーク kaijin22 2012年5月17日 5:22
    2012年5月17日 2:29

すべての返信

  • もう少し切り分けできませんか?

    AsyncFileUpload ではなくて普通の FileUpload を使った場合どうなる
    か、showModalDialog(これはいろいろ問題が多いそうです)を使わな
    いとどうなるかなど。

    2012年5月16日 14:32
  • SurferOnWww様

    ご指摘・ご意見ありがとうございます。検証中ですが、一次回答させて頂きます。

    >もう少し切り分けできませんか?

    上記は、画面を分割する。などのことでしょうか。

    フレーム親・フレーム子A(ダウンロード)・フレーム子B(アップロード)みたいなことができれば良いのですが、

    フレームAにGridViewをファイル一覧を表示しており、そのGridViewのボタンで、ダウンロードさせています。

    フレームBでアップロードした際などに、フレームAのGridViewが更新できれば問題ないかもしれませんが、他フレームの更新方法は理解できなかったので断念しました。

    FileUpload を使った場合どうなる

    ご指摘通り、別画面が展開されずにダウンロードダイアログが表示されました。

    まだアップロード処理が完全に作成できていないのでわかりませんが、代替案としては利用できそうです。

    showModalDialogは、当ダイアログを利用しない場合、自作?ダイアログを作成する必要が出てきますので、こちらは少し難しいかもしれません。

    (ご指摘通り、showModalDialogはネットで調べると「利用しない方が良い。」とのコメントがちらほら。。。)

    (ただ、target設定を変更した上で、別画面が展開されるので原因はダイアログにはないような)

    ひとまず、FileUploadで検証してみようと思います。

    ただ、こちらの場合はFileUploadとは別にボタンを用意する必要があります。

    そうすると、クライアント側の操作が一つ増えるので、採用頂けるか分からないので、可能であればAsyncFileUploadで実装したいです。


    • 編集済み kaijin22 2012年5月17日 2:12
    2012年5月17日 2:11
  • 質問文からの想像ですが、AsyncFileUploadの戻り値としてダウンロードデータを送信していますか?

    切り分けというのはそういう組み合わせ部分を分解し、AsyncFileUpload / ファイルダウンロード / showModalDialog のどこに問題があるのか、単独で問題がなければ何と何を組み合わせたときに問題が発生するのか。そういう原因を探ることです。

    原因は判明していませんが、とりあえずの提案としては、AsyncFileUploadの完了をブラウザー側で検出したら改めてダウンロードページにジャンプするとかどうでしょう?

    • 回答としてマーク kaijin22 2012年5月17日 5:22
    2012年5月17日 2:29
  • 佐祐理様

    ご指摘・ご意見ありがとうございます。
    showModalDialogを完全に分離した訳ではありませんが、
    「ダイアログ起動(showModalDailog) ⇒ 登録済みのファイルをダウンロード(Response.End)」の流れは問題なくできます。(別ウィンドウが展開されません)

    一概には言え無いかもしれませんが、FileUploadに切り替えた場合は別ウィンドウが表示されないので、原因はAsyncFileUploadにあると考えています。
    ※元々の原因はダイアログだったと思うのですが、iframe分割、target設定により解消しているので(サイトのURLは上記)

    >質問文からの想像ですが、AsyncFileUploadの戻り値としてダウンロードデータを送信していますか?
    仰る通りです。
    JavaScriptで拡張子やファイルサイズを検証した後、問題なければ即座にアップロードするサーバ処理を実行しています。

    原因は判明していませんが、とりあえずの提案としては、AsyncFileUploadの完了をブラウザー側で検出したら改めてダウンロードページにジャンプするとかどうでしょう?
    試しに、提案して頂いた内容を実装したところ、ダイアログが表示されずにダウンロードできました。
    対応内容:更新処理発行後、Response.Redirect("子画面(自分).aspx");を実施し、ダウンロードページを再描画
    恐らく問題ないとは思いますが、もう少し検証(影響調査)をした後に改めて報告させていただきます。

    ===========================
    ある程度の稼働確認をしたところ、恐らく問題ありません。
    SurferOnWww様、佐祐理様

    貴重なアドバイスありがとうございました。
    この件で2,3日時間を費やしていたので、助かりました。

    • 編集済み kaijin22 2012年5月17日 5:20
    2012年5月17日 3:06
  • すでに解決済みのようですので、いまさらレスは不要かもしれませ
    んが・・・

    > フレームBでアップロードした際などに、フレームAのGridViewが
    > 更新できれば問題ないかもしれませんが、他フレームの更新方法
    > は理解できなかったので断念しました。

    AJAX Control Toolkit の ModalPopup を使ってはいかがですか。

    ModalPopup Demonstration
    http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/ModalPopup/ModalPopup.aspx

    GridView 部分とアップロード部分を同一ページに実装して、アップ
    ロード部分を ModalPopup で表示すれば、望むことができるのでは
    ないかと思います。

    ダウンロードをモーダルダイアログで行う理由が分りませんが、その
    必要があるなら、ダウンロードのための UI 等も同一ページに実装し、
    ModalPopup で表示するというのはいかがですか?

    とにかく、showModalDialog はブラウザ依存で、問題が多いので、使
    うのは避けた方が無難です。

    > FileUploadに切り替えた場合は別ウィンドウが表示されないので、
    > 原因はAsyncFileUploadにあると考えています。

    AsyncFileUpload を使うと別ウィンドウが表示されるという問題の原
    因は、以下のページに書いてあることのように思われます。(未検証
    です)

    AsyncFileUpload issue with usage in an IFRAME
    http://code2life.blogspot.jp/2009/12/asyncfileupload-issue-with-usage-in.html

    解決策も書いてあるので試してみてください。

    2012年5月17日 13:34