2009-07-30 7 views
1

Ich erstelle dynamisch eine Zip-Datei in einer ASP.NET-Seite und sende dann den Stream an Response.Das Streaming einer Datei in ASP.NET funktioniert in Firefox, aber nicht im Internet Explorer

In Firefox kann ich die Datei mit dem Namen Images.zip herunterladen. Es funktioniert korrekt. In Internet Explorer 7 wird versucht, eine Datei mit dem Namen ZipExport.aspx herunterzuladen, oder, wenn sie sich in einem generischen Handler befindet, ZipExport.ashx, und sie besagt, dass sie nicht auf dem Server gefunden werden kann und fehlschlägt.

Hier ist mein Code:

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

Ich möchte nicht über eine Httphandler für eine bestimmte Datei machen und es mit IIS registrieren.

Gibt es etwas Einfaches, das ich vermisse, oder ist Internet Explorer schuld daran, dass ich meinen Inhaltsdispositionskopf ignoriert habe?

Edit: entfernt ich diese Zeilen und Dinge gearbeitet:

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

Edit: Hier ist der Code funktioniert, wenn jemand interessiert ist:

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(); 
} 
+0

Als ein Nebenproblem möchten Sie möglicherweise BufferOutput auf false festlegen. – RichardOD

+0

gibt dir Fiddler irgendwelche Informationen über das Problem? – BigBlondeViking

Antwort

3

Response.End Ersetzen mit HttpContext.Current.ApplicationInstance.CompleteRequest

Versuchen Sie diesen Schnitt Down-Version:

Scheitern, dass Microsoft Fiddler verwenden, um zu sehen, was sonst schief gehen könnte.

+0

Ich wähle dies als die Antwort, da es das Problem gelöst hat. Nach weiteren Tests scheint die Problem-Zeile die Response.Cache.SetCacheability (HttpCacheability.NoCache) zu sein; – Chet

+0

@ Chet - das ist gut. Manchmal hilft die Rückkehr zu einer einfacheren Version, das Problem zu identifizieren. – RichardOD

+0

Froh, dass Sie es sortiert haben. –

3

Sie eine ASHX Handler schaffen sollte für Das. Haben Sie versucht, stattdessen den Inhaltstyp "application/zip" zu verwenden?

+0

Ja, habe ich. Gleicher Fehler. – Chet

+0

Guter Punkt über die Anwendung/zip. – RichardOD

+0

Auch ein guter Punkt über die Verwendung eines IHttpHandler. – RichardOD

2

Statt Response.ClearHeaders(), führen Sie ein vollständiges Response.Clear() und danach tun, um ein Response.End()

+0

Ja - nicht tun Response.Clear könnte die Ursache sein. – RichardOD

+0

Gute Ideen, aber ich glaube nicht, dass das wirklich zum Kernproblem wird. – Chet

0

Ich habe noch nie ZipFile Klasse verwendet wird, dass gesagt wird, wenn ich Dateien senden verwenden i 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(); 
+0

Danke, ja, das dachte ich mir. ZipFile.Save ist eine bequeme Methode, mit der die API Werbung für genau diesen Zweck ankündigt. Es funktioniert natürlich perfekt in Firefox. – Chet

+0

Wenn IE wie FF funktioniert hätten wir alle weniger bezahlt ... :) – BigBlondeViking

1

ich gerade das gleiche Problem aufgetreten (und fix) Dank.

Ein Punkt, der zukünftigen Suchern helfen könnte, ist, dass das Problem nur für mich auf HTTPS-Sites aufgetreten ist. Der Code lief auf meinem lokalen HTTP-Server einwandfrei.

Ich denke, mit HTTPS wird es sowieso nicht zwischengespeichert, so kann in einer "If (Request.IsSecureConnection)" Bedingung eingeschlossen werden.

0

i begegnet nur das gleiche Problem und verwaltet

Response.Clear() zu fixieren; 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();