2017-02-03 6 views
-4

Ich debugge eine ziemlich seltsame Situation mit DotNetZip und ASP.NET. Kurz gesagt, die resultierenden Zip-Dateien, die vom Code erstellt werden, werden von Firefox zuverlässig heruntergeladen, aber die meisten anderen Browser geben zeitweise einen Netzwerkfehler zurück. Ich habe den Code untersucht und es liest sich so generisch wie alles, was DotNetZip betrifft.Von DotNetZip erstellte ZIP-Dateien mit ASP.NET verursachen manchmal Netzwerkfehler

Irgendwelche Hinweise?

Danke!

EDIT: Hier ist die vollständige Methode. Wie ich bereits erwähnt, ist es etwa so allgemein wie es nur geht:

protected void btnDownloadFolders_Click(object sender, EventArgs e) 
{ 
    //Current File path 
    var diRoot = new DirectoryInfo(_currentDirectoryPath); 
    var allFiles = Directory.GetFiles(diRoot.FullName, "*.*", SearchOption.AllDirectories); 
    Response.Clear(); 
    Response.BufferOutput = false; 

    var archiveName = String.Format("{0}-{1}.zip", diRoot.Name, DateTime.Now.ToString("yyyy-MM-dd HHmmss")); 
    Response.ContentType = "application/zip"; 
    Response.AddHeader("content-disposition", "inline; filename=\"" + archiveName + "\""); 

    using (var zip = new ZipFile()) 
    { 
     foreach (var strFile in allFiles) 
     { 
      var strFileName = Path.GetFileName(strFile); 
      zip.AddFile(strFile, 
         strFile.Replace("\\" + strFileName, string.Empty).Replace(diRoot.FullName, string.Empty)); 
     } 

     zip.Save(Response.OutputStream); 
    } 
    Response.Close(); 
} 
+0

Bitte geben Sie eine Minimal, Complete, prüfbare Beispiel http://stackoverflow.com/help/mcve – Sunshine

+0

Sie benötigen mehr Informationen, als dies zur Verfügung zu stellen. Wir können Ihren Bildschirm nicht sehen oder Ihren Netzwerkverkehr untersuchen. Ich nehme an, Sie sind wegen eines Code-Problems hier? Wie können wir helfen, wenn wir den Code nicht sehen können? – Amy

+0

Um dieses Problem zu lösen, ändern Sie 'Response.Close();' in 'Response.Flush();' Siehe https://Stackoverflow.com/a/736462/481207. (Chrome Version 61.) – Matt

Antwort

1

sein Es könnte, weil Sie nicht die content-length Senden sind. Ich habe Fehler beim Senden von Dateien an den Browser festgestellt, wo sie nicht angegeben wurden. Erstellen Sie die Zip-Datei in einem MemoryStream. Speichern Sie den Stream in einem Byte-Array, sodass Sie die Länge auch als Antwort senden können. Obwohl ich nicht sicher sagen kann, dass es Ihr spezifisches Problem beheben wird.

byte[] bin; 

using (MemoryStream ms = new MemoryStream()) 
{ 
    using (var zip = new ZipFile()) 
    { 
     foreach (var strFile in allFiles) 
     { 
      var strFileName = Path.GetFileName(strFile); 
      zip.AddFile(strFile, strFile.Replace("\\" + strFileName, string.Empty).Replace(diRoot.FullName, string.Empty)); 
     } 

     //save the zip into the memorystream 
     zip.Save(ms); 
    } 

    //save the stream into the byte array 
    bin = ms.ToArray(); 
} 

//clear the buffer stream 
Response.ClearHeaders(); 
Response.Clear(); 
Response.Buffer = true; 

//set the correct contenttype 
Response.ContentType = "application/zip"; 

//set the filename for the zip file package 
Response.AddHeader("content-disposition", "attachment; filename=\"" + archiveName + "\""); 

//set the correct length of the data being send 
Response.AddHeader("content-length", bin.Length.ToString()); 

//send the byte array to the browser 
Response.OutputStream.Write(bin, 0, bin.Length); 

//cleanup 
Response.Flush(); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
+0

Entschuldigung für die Verzögerung - ich werde diese Lösung auf unserem Alpha-Bereich versuchen und sehen, ob es für uns funktioniert. Vielen Dank! –

+0

Aus Mangel an einem besseren Ort, um die Ergebnisse zu setzen, funktioniert dieser Code. –

+0

Beachten Sie, dass die Verwendung von Response.Close(); oder Response.End(); den Download unterbricht. Verwenden Sie stattdessen 'Response.Flush();' und dann ist der Header 'content-length' nicht erforderlich. Siehe https://stackoverflow.com/a/736462/481207 – Matt

Verwandte Themen