2009-07-30 6 views
1

Je génère dynamiquement un fichier Zip dans une page ASP.NET, puis envoie le flux à Response.La diffusion d'un fichier dans ASP.NET fonctionne dans Firefox mais pas dans Internet Explorer

Dans Firefox, je peux télécharger le fichier Images.zip. Cela fonctionne correctement. Dans Internet Explorer 7, il essaie de télécharger un fichier appelé ZipExport.aspx ou s'il est dans un gestionnaire générique, ZipExport.ashx et il dit qu'il ne peut pas être trouvé sur le serveur et échoue.

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

Je ne veux pas faire un HTTPHandler pour un certain fichier et l'enregistrer avec IIS.

Y a-t-il quelque chose de simple qui me manque ou est-ce qu'Internet Explorer est responsable d'ignorer mon en-tête de disposition de contenu?

Edit: Je retire ces lignes et les choses ont fonctionné:

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

Edit: Voici le code de travail si quelqu'un est intéressé:

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

En tant que problème secondaire, vous pouvez définir le paramètre BufferOutput sur false. – RichardOD

+0

est-ce que fiddler vous donne des informations sur le problème? – BigBlondeViking

Répondre

3

Remplacer Response.End avec HttpContext.Current.ApplicationInstance.CompleteRequest

Essayez cette coupe version en panne:

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

Si vous n'utilisez pas Microsoft Fiddler pour voir ce qui ne va pas.

+0

Je choisis ceci comme réponse car il a résolu le problème. Après plus de tests, la ligne de problème semble être le Response.Cache.SetCacheability (HttpCacheability.NoCache); – Chet

+0

@ Chet - c'est bon. Parfois, revenir à une version plus basique aide à identifier le problème. – RichardOD

+0

Heureux que vous l'ayez trié. –

3

Vous devez créer un ASHX Handler pour cette. Avez-vous essayé d'utiliser un type de contenu 'application/zip' à la place?

+0

Oui, j'ai. Même problème. – Chet

+0

Bon point sur l'application/zip. – RichardOD

+0

Également un bon point sur l'utilisation d'un IHttpHandler. – RichardOD

2

Au lieu de Response.ClearHeaders(), faire un plein Response.Clear(), et par la suite, faire une Response.End()

+0

Oui- ne pas faire Response.Clear pourrait être la cause. – RichardOD

+0

Bonnes idées, mais je ne pense pas que cela soit vraiment au cœur du problème. – Chet

0

Je ne l'ai jamais utilisé la classe ZipFile, qui dit quand j'envoyer des fichiers que j'utilise 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

Merci, oui, j'ai considéré cela. Le ZipFile.Save est une méthode de commodité que l'API annonce quelque chose à utiliser à cette fin. Cela fonctionne parfaitement dans Firefox, bien sûr. – Chet

+0

si IE travaillait comme FF nous serions tous payés moins ... :) – BigBlondeViking

1

Je viens rencontré le même problème (et fixe) grâce. Un point qui pourrait aider les futurs chercheurs est que le problème ne s'est posé que pour moi sur les sites HTTPS. Le code s'est bien passé sur mon serveur local HTTP.

Je suppose qu'avec HTTPS il ne sera pas mis en cache de toute façon et peut donc être inclus dans une condition "if (Request.IsSecureConnection)".

0

je viens rencontré le même problème et a réussi à fixer

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(); 
Questions connexes