Pregunta

Genero dinámicamente un archivo Zip en una página ASP.NET y luego envío la secuencia a Response.

En Firefox, puedo descargar el archivo llamado Images.zip . Funciona correctamente En Internet Explorer 7 intenta descargar un archivo llamado ZipExport.aspx o si está en un controlador genérico, ZipExport.ashx y dice que no se puede encontrar en el servidor y falla.

Aquí está mi código:

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

No quiero hacer un HTTPHandler para un determinado archivo y registrarlo con IIS.

¿Hay algo simple que me falta o Internet Explorer tiene la culpa de ignorar mi encabezado de disposición de contenido?

Editar: eliminé estas líneas y las cosas funcionaron:

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

Editar: Aquí está el código de trabajo si alguien está interesado:

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();
}
¿Fue útil?

Solución

Reemplace Response.End con HttpContext.Current.ApplicationInstance.CompleteRequest

Pruebe esta versión reducida:

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 no se usa Microsoft Fiddler para ver qué más podría estar saliendo mal.

Otros consejos

Debería crear un ASHX Handler para eso. ¿Has intentado usar un tipo de contenido de 'aplicación / zip' en su lugar?

En lugar de Response.ClearHeaders (), haga una Response.Clear () completa, y luego, haga una Response.End()

Acabo de encontrar el mismo problema (y solución) gracias.

Un punto que podría ayudar a los futuros buscadores es que el problema solo surgió para mí en los sitios HTTPS. El código funcionó bien en mi servidor local HTTP.

Supongo que con HTTPS no se almacenará en caché de todos modos, por lo que se puede incluir en un " if (Request.IsSecureConnection) " condición.

Nunca he usado la clase ZipFile, dicho esto cuando envío archivos utilizo 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();

acabo de encontrar el mismo problema y logré solucionarlo

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top