0

ユーザーがいくつかのファイルをzipファイルとしてダウンロードできるようにするasp.netWebサイトの機能に取り組んでいます。DotNetZipライブラリを使用してzipファイルを生成しています。

私のコードは次のようになります:

protected void OkbtnZipExport_OnClickEvent(object sender, EventArgs e)
{
        var selectedDocumentIds = GetSelectedDocIds();

        string archiveName = String.Format("archive-{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));            
        AddResponseDataForZipFile(Response, archiveName);            

        try
        {
            string errorMessage = Utils.ExportToZip(selectedDocumentIds, arkivdelSearchControl.GetbraArkivConnection(), Response.OutputStream);
            if (!string.IsNullOrEmpty(errorMessage))
            {
               LiteralExportStatus.Text = errorMessage;                                                     
            }
            else
                LiteralExportStatus.Text = "Success";

        }
        catch (Exception ex)
        {
            LiteralExportStatus.Text = "Failure " + ex.Message;                
        }

        Response.Flush();
        Response.Close();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
}

private void AddResponseDataForZipFile(HttpResponse response, string zipName)
{
        Response.Clear();
        Response.BufferOutput = false;
        Response.ContentType = "application/x-zip-compressed";
        Response.AddHeader("content-disposition", "attachment; filename=" + zipName);
        Response.AddHeader("Expires", "0");
        Response.AddHeader("Content-Description", "Zip Arcive");
}

ここで、Utils.ExportToZipメソッドが失敗した場合など、問題が発生した場合は、ダウンロードダイアログではなく、ユーザーにエラーメッセージを表示したいと思います。ダウンロード操作をキャンセルするには、Responseオブジェクトから一部のデータを削除する必要がありますか?

よろしくお願いします

OKB

4

2 に答える 2

1

現時点ではコメントできないので、この回答を1つとしてください。

Utils.ExportToZip はどのように機能しますか? コンストラクターに Response.OutputStream を使用する理由が、zip ファイルを直接書き込むことである場合は、AddResponseDataForZipFile メソッドでそれを「元に戻す」ために Buffering を設定する必要があります。

Response.BufferOutput = true;
于 2010-10-29T11:24:08.510 に答える
1

まず、電話しないでくださいHttpContext.Current.ApplicationInstance.CompleteRequest();

参照。

ある時点で、CompleteRequest() を示すサンプル コードがいくつかありましたが、それは間違っています。

第二に、説明したことを行うには、何かを送信する前に、zip ファイルが正しく完全に作成できることを確認する必要があります。つまりAddResponseDataForZipFile()、zipfile が完全に作成された後にのみ実行する必要があります。つまり、単純に に保存するのではなく、サーバー上に実際の zip ファイルを作成する必要がありますResponse.OutputStream。ファイルが正常に作成されたら、 を呼び出しAddResponseDataForZipFile()、一時 zip ファイルのバイトをストリーミングし、を呼び出して、一時 zip ファイルResponse.Close()を削除します。

于 2010-11-08T02:59:45.533 に答える