Pergunta

Eu estou gerando dinamicamente um arquivo Zip em uma página ASP.NET e, em seguida, enviar o fluxo para Response.

No Firefox, eu posso baixar o arquivo chamado Images.zip. Ele funciona corretamente. No Internet Explorer 7 ele tenta baixar um arquivo chamado ZipExport.aspx ou se é em um manipulador genérico, ZipExport.ashx e ele diz que não pode ser encontrado no servidor e falha.

Aqui está o meu 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);

Eu não quero fazer uma HTTPHandler para um determinado arquivo e registrá-lo com o IIS.

Existe algo simples que eu estou ausente ou é o Internet Explorer em falta por ignorar o meu cabeçalho Content-Disposition?

Editar: Eu removido estas linhas e as coisas funcionavam:

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

Editar: Aqui está o código de trabalho se alguém estiver interessado:

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

Solução

Substituir Response.End com HttpContext.Current.ApplicationInstance.CompleteRequest

Tente este corte para baixo versão:

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

Na falta deste uso Microsoft Fiddler para ver o que mais poderia estar acontecendo de errado.

Outras dicas

Você deve criar um ASHX Handler para isso. Você já tentou usar um tipo de conteúdo de 'application / zip' em vez disso?

Em vez de Response.ClearHeaders (), fazer uma completa Response.Clear () , e depois, fazer um Response.End ()

Eu só encontrou o mesmo problema (e correção) graças.

Um ponto que poderia ajudar futuros pesquisadores é que o problema só surgiu para mim em sites HTTPS. A multa correu código no meu servidor HTTP local.

Eu acho que com HTTPS não serão armazenados em cache de qualquer maneira isso pode ser incluído em um "se (Request.IsSecureConnection)" condição.

Eu nunca usei classe ZipFile, que se disse quando eu enviar arquivos eu uso 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();

Eu só encontrou o mesmo problema e conseguiu correção

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top