Domanda

Sto generando dinamicamente un file Zip in una pagina ASP.NET e quindi inviando lo stream a Response.

In Firefox, posso scaricare il file denominato Images.zip . Funziona correttamente In Internet Explorer 7 tenta di scaricare un file chiamato ZipExport.aspx o se si trova in un gestore generico, ZipExport.ashx e dice che non può essere trovato sul server e fallisce.

Ecco il mio codice:

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

Non voglio creare un HTTPHandler per un determinato file e registrarlo con IIS.

C'è qualcosa di semplice che mi manca o Internet Explorer è in errore per aver ignorato la mia intestazione di disposizione dei contenuti?

Modifica: ho rimosso queste righe e le cose hanno funzionato:

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

Modifica: ecco il codice di lavoro se qualcuno è interessato:

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();
}
È stato utile?

Soluzione

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

Prova questa versione ridotta:

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

Fallimento che utilizza Microsoft Fiddler per vedere cos'altro potrebbe andare storto.

Altri suggerimenti

Dovresti creare un ASHX Handler per questo. Hai mai provato a utilizzare un tipo di contenuto "application / zip"?

Invece di Response.ClearHeaders (), esegui un Response.Clear () completo e, successivamente, esegui un Response.End()

Ho appena riscontrato lo stesso problema (e risolto) grazie.

Un punto che potrebbe aiutare i futuri ricercatori è che il problema è emerso solo per me sui siti HTTPS. Il codice funzionava bene sul mio server locale HTTP.

Suppongo che con HTTPS non verrà comunque memorizzato nella cache, quindi può essere racchiuso in un " if (Request.IsSecureConnection) " condizioni.

Non ho mai usato la classe ZipFile, detto questo quando invio i file utilizzo 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();

Ho appena riscontrato lo stesso problema e sono riuscito a risolvere

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top