代码之家  ›  专栏  ›  技术社区  ›  Chet

在ASP.NET中传输文件在Firefox中有效,但在Internet Explorer中无效。

  •  1
  • Chet  · 技术社区  · 15 年前

    我正在ASP.NET页中动态生成一个zip文件,然后将流发送到响应。

    在Firefox中,我可以下载名为 Images.zip . 它工作正常。在Internet Explorer 7中,它尝试下载名为 ZipExport.aspx 或者如果它在通用处理程序中, ZipExport.ashx 它说它在服务器上找不到并且失败了。

    以下是我的代码:

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

    我不想为某个文件制作一个httphandler并在IIS中注册它。

    是否有一些简单的东西丢失了,或者Internet Explorer忽略了我的内容处置标题是错误的?

    编辑:我删除了这些行,工作了:

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

    编辑:如果有人感兴趣,这里是工作代码:

    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();
    }
    
    6 回复  |  直到 7 年前
        1
  •  3
  •   RichardOD    15 年前

    替换 Response.End 具有 HttpContext.Current.ApplicationInstance.CompleteRequest

    尝试此精简版本:

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

    如果不能做到这一点,请使用Microsoft Fiddler查看可能发生的其他问题。

        2
  •  3
  •   Dan Diplo    15 年前

    您应该创建一个 ASHX Handler 为此。您是否尝试使用“application/zip”内容类型?

        3
  •  2
  •   Brandon    15 年前

    不是response.clearHeaders(),而是执行一个完整的 响应。清除() 然后,做一个 响应()

        4
  •  1
  •   Martin Smith    15 年前

    我刚刚遇到同样的问题(并解决)谢谢。

    有一点可能对未来的搜索者有所帮助,那就是这个问题只出现在https网站上。代码在我的HTTP本地服务器上运行正常。

    我猜使用HTTPS,它无论如何都不会被缓存,因此可以被包含在“if(request.isseconnection)”条件中。

        5
  •  0
  •   BigBlondeViking    15 年前

    我从未使用过zipfile类,也就是说,当我发送文件时,我使用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();
    
        6
  •  0
  •   Veera Induvasi    7 年前

    我刚刚遇到了同样的问题,并设法解决了

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