Frage

Ich arbeite an einer Funktionalität in meiner asp.net Website, die es dem Benutzer ermöglicht, einige Dateien als ZIP-Datei zum Download bereit. Ich verwende die DotNetZip Bibliothek die Zip-Datei zu erzeugen.

Mein Code sieht wie folgt aus:

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");
}

Nun, wenn etwas schief geht, sagen die Utils.ExportToZip Methode fehlschlägt, möchte ich eine Fehlermeldung an den Benutzer präsentieren und nicht der Download-Dialog. Muss ich, um einige Daten aus dem Response-Objekt entfernen Sie den Download-Vorgang abzubrechen?

Mit freundlichen Grüßen

OKB

War es hilfreich?

Lösung

Zuerst Rufen Sie nicht HttpContext.Current.ApplicationInstance.CompleteRequest();

Referenz.

An einem Punkt gab es einige Beispiel-Code, der CompleteRequest zeigte (), aber es ist falsch.

Zweitens - zu tun, was Sie beschreiben, Sie werden, um sicherzustellen, müssen, dass die Zip-Datei richtig und vollständig erstellt werden kann, bevor etwas zu senden. Das heißt, Sie sollten das AddResponseDataForZipFile() nur möglich, nachdem die Zip-Datei vollständig erstellt wird. Das bedeutet benötigen Sie eine tatsächliche Zip-Datei auf dem Server zu erstellen, und einfach nicht zu Response.OutputStream speichern aus. Sobald die Datei erfolgreich erstellt wurde, dann AddResponseDataForZipFile() rufen, strömen die Bytes für die temporäre ZIP-Datei, Anruf Response.Close(), löschen Sie die temporäre ZIP-Datei.

Andere Tipps

Ich kann zur Zeit nicht kommentieren, nehmen so diese Antwort als ein.

Wie funktioniert Utils.ExportToZip Arbeit? Wenn der Grund, warum es die Response.OutputStream für den Konstruktor ist die Zip-Datei direkt in sie zu schreiben, dann müssen Sie Buffering, um „Rückgängig“ setzen, dass in Ihrer AddResponseDataForZipFile Methode:

Response.BufferOutput = true;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top