1

私は ASP.NET (2.0) で作業しており、ユーザーが一連のファイルを選択して zip としてダウンロードできるページがあります。DotNetZipライブラリを使用して、元に戻すのに苦労することなくこれを機能させました(おそらく問題には関係ありませんが、完全を期すために含まれています)。

ユーザーがダウンロードするファイルを確認した後、ページはポストバックを実行し、ボタン クリック イベント ハンドラーで次のコードを使用します。

    Response.Clear();
    Response.BufferOutput = false; // false = stream immediately
    Response.ContentType = "application/zip";
    Response.AddHeader("content-disposition", "filename=FileRequest.zip");

    using (ZipFile zip = new ZipFile())
    {
        zip.AddFile(MapPath("/datafiles/fileToZip.pdf"), "");
        zip.Save(Response.OutputStream);
    }
    Response.Close();

そして、これはすべてうまくいくようです。ユーザーがボタンをクリックすると、ダウンロード ウィンドウがポップアップし、ユーザーは zip をダウンロードします。すべてが良いです...

...ページで何か他のことをしたいと決めるまで。フォームのボタンが反応しなくなりました。たとえば、もう一度ダウンロード ボタンをクリックしても何も起こりません。ページをリロードすると、この動作を繰り返すことができます...一度機能すると、何もしなくなります。

ブラウザが新しいリクエストを送信しない理由がわかりません。「回転」したり、忙しくしたりしているわけではありません。これはブラウザの問題かと思いましたが、IEでもFirefoxでも同じことを繰り返していたので、私の理解不足のようです。奇妙なことに、応答していないように見えるのはフォーム送信要素だけです。Javascript は引き続き機能し、通常のリンクも機能します。

では、なぜこれが起こっているのでしょうか。どうすれば回避できますか?

4

2 に答える 2

1

問題はおそらくあなたが戻ってくることにあります。

   Response.ContentType = "application/zip";

これが(実際のコンテンツとともに)送信されると、ブラウザは何もすることが残っていないと想定します(私は信じています)。

おそらく、ファイルの選択をセッションパラメータ(または同等のもの)に保存し、ダウンロードコードを含むポップアップウィンドウを開くことによって、ファイルをダウンロードするための新しいウィンドウを作成する必要があります。

これにより、親ページが適切な状態になります。

于 2012-11-19T14:32:41.327 に答える
0

content-disposition ヘッダーは推奨されない解決策のようです。ただし、 zip ファイルへの標準のリダイレクトを使用すると、ASP.NET フォームが応答しないという同じ効果が発生します。

「 Response.Redirect to new window」の Q&A でTančev Saša のコードを使用して、非常によく似た問題 (ダウンロードのためにサーバーから *.csv ファイルを返す) を解決しました。ブラウザによってはポップアップ警告が表示される場合もありますが、ダウンロードサイトではよくあることだと思います。

于 2013-10-02T09:50:12.850 に答える