1

ASP.NETページでZipファイルを動的に生成してから、ストリームをResponseに送信しています。

Firefoxでは、という名前のファイルをダウンロードできますImages.zip。正しく動作します。Internet Explorer 7では、と呼ばれるファイルをダウンロードしようとしますが、ZipExport.aspxそれが汎用ハンドラーにある場合ZipExport.ashxは、サーバー上で見つからないと表示され、失敗します。

これが私のコードです:

Response.BufferOutput = true;
Response.ClearHeaders();
Response.ContentType = "application/octet-stream";
Response.AddHeader("content-disposition", "attachment; filename=Images.zip");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoServerCaching();
Response.Cache.SetNoStore();
Response.Cache.SetMaxAge(System.TimeSpan.Zero);
ZipFile zip = new ZipFile();
zip.AddFile(Server.MapPath("sample1.png"));
zip.Save(Response.OutputStream);

特定のファイルのHTTPHandlerを作成して、IISに登録したくありません。

私が見逃している単純なものがありますか、それともInternet Explorerが私のcontent-dispositionヘッダーを無視したことに責任がありますか?

編集:私はこれらの行を削除し、物事はうまくいきました:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

編集:誰かが興味を持っている場合は、これが動作するコードです:

public void ProcessRequest(HttpContext context)
{  
    context.Response.Clear();
    context.Response.BufferOutput = false;
    context.Response.ContentType = "application/octet-stream";
    context.Response.AddHeader("content-disposition", 
        "attachment; filename=ChartImages.zip");
    context.Response.Cache.SetNoServerCaching();
    context.Response.Cache.SetMaxAge(System.TimeSpan.Zero);
    using(ZipFile zip = new ZipFile())
    {
        zip.AddFile(context.Server.MapPath("sample1.png"));
        zip.Save(context.Response.OutputStream);
    }
    context.ApplicationInstance.CompleteRequest();
}
4

6 に答える 6

3

そのためのASHXハンドラーを作成する必要があります。代わりに「application/zip」のコンテンツタイプを使用してみましたか?

于 2009-07-30T20:06:50.260 に答える
3

Response.Endと置き換えますHttpContext.Current.ApplicationInstance.CompleteRequest

このカットダウンバージョンを試してください:

Response.Clear();
Response.BufferOutput = false;

Response.ContentType = "application/zip";
Response.AddHeader("content-disposition", "attachment; filename=Images.zip");
using(ZipFile zip = new ZipFile())
{
  zip.AddFile(Server.MapPath("sample1.png"));
  zip.Save(Response.OutputStream);
}
HttpContext.Current.ApplicationInstance.CompleteRequest();

Microsoft Fiddler を使用して失敗すると、他に何が問題なのかを確認できます。

于 2009-07-30T20:16:34.203 に答える
2

Response.ClearHeaders()の代わりに、完全なResponse.Clear()を実行し、その後、Response.End()を実行します。

于 2009-07-30T20:07:09.917 に答える
1

同じ問題に遭遇しました(そして修正しました)ありがとう。

将来の検索者に役立つかもしれない 1 つのポイントは、問題が HTTPS サイトでのみ発生したことです。コードは HTTP ローカル サーバーで正常に実行されました。

とにかくHTTPSではキャッシュされないので、「if(Request.IsSecureConnection)」条件で囲むことができると思います。

于 2009-09-02T19:46:44.943 に答える
0

私はZipFileクラスを使用したことがありません。ファイルを送信するときにResponse.BinaryWrite()を使用すると言われています

//Adds document content type
context.Response.ContentType = currentDocument.MimeType;
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.AddHeader("content-disposition", "attachment;filename=\"" + currentDocument.Name + "\"");



//currentDocument.Document is the byte[] of the file
context.Response.BinaryWrite(currentDocument.Document);

context.Response.End();
于 2009-07-30T20:16:50.927 に答える
0

私はちょうど同じ問題に遭遇し、なんとか修正することができました

Response.Clear(); Response.BufferOutput = false;

                    Response.ContentType = "application/zip";
                    //Response.AddHeader("content-disposition", "inline; filename=\"" + ArchiveName + "\"");
                    Response.AddHeader("content-disposition", "attachment; filename=\"" + ArchiveName + "\"");
                    zipFile.Save(Response.OutputStream);
                   // Response.Close();
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                    Response.Clear();
                    Response.End();
于 2017-05-08T12:12:06.093 に答える