La diffusion en continu d'un fichier dans ASP.NET fonctionne dans Firefox mais pas dans Internet Explorer

StackOverflow https://stackoverflow.com/questions/1209002

Question

Je génère dynamiquement un fichier Zip dans une page ASP.NET, puis j'envoie le flux à Response.

Dans Firefox, je peux télécharger le fichier nommé Images.zip . Cela fonctionne correctement Dans Internet Explorer 7, il tente de télécharger un fichier appelé ZipExport.aspx ou, s'il est dans un gestionnaire générique, ZipExport.ashx et indique qu'il est introuvable sur le serveur. é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 créer un HTTPHandler pour un certain fichier et l'enregistrer avec IIS.

Y at-il quelque chose de simple qui me manque ou Internet Explorer est-il à blâmer pour avoir ignoré mon en-tête de disposition du contenu?

Modifier: j'ai supprimé ces lignes et tout a fonctionné:

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

Modifier: voici le code de travail si vous êtes 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();
}
Était-ce utile?

La solution

Remplacez Response.End par HttpContext.Current.ApplicationInstance.CompleteRequest

Essayez cette version réduite:

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 ne réussissez pas, utilisez Microsoft Fiddler pour voir ce qui pourrait mal tourner.

Autres conseils

Vous devez créer un gestionnaire ASHX pour cela. Avez-vous essayé d’utiliser un type de contenu "application / zip" à la place?

Au lieu de Response.ClearHeaders (), effectuez une Response.Clear () complète, puis une Response.End ()

Je viens de rencontrer le même problème (et corriger) merci.

Un point qui pourrait aider les futurs chercheurs est que le problème ne m'est apparu que sur les sites HTTPS. Le code a fonctionné correctement sur mon serveur HTTP local.

Je suppose qu'avec HTTPS, il ne sera de toute façon pas mis en cache, donc il peut être placé dans un "if (Request.IsSecureConnection)" &; condition.

Je n’ai jamais utilisé la classe ZipFile, cela dit quand j’envoie des fichiers, 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();

Je viens de rencontrer le même problème et j'ai réussi à résoudre le problème

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top