【问题标题】:"File couldn't be downloaded" in Internet Explorer with ASP.NET MVC带有 ASP.NET MVC 的 Internet Explorer 中的“无法下载文件”
【发布时间】:2012-03-07 22:03:48
【问题描述】:

所以我从这样的操作中返回FileContentResult

return File(pck.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "MyExcelFile.xlsx");

在 IE(我使用的是 IE9,版本 9.0.8112.16421)中单击“打开”时,它会显示“无法下载文件”,并且会向用户显示“重试”按钮。如果他们单击重试,它工作正常。如果他们点击保存,它工作正常。在 Firefox 中,它运行良好。

如何让用户在第一次点击打开时打开文件?

【问题讨论】:

  • 安装 fiddler 并在您发出第一个请求时运行它。您将能够检查从服务器返回的响应。也许这会对这个问题有所启发。 fiddler2.com/fiddler2
  • @MattGrande 你在这方面有什么收获吗?我也有类似的问题,但使用常规的 ASP.NET(不涉及 MVC)和 CSV 内容类型(不仅仅是 XSL/XSLX)。我发现 various sites 带有“解决方案”,但它们似乎都不是很有帮助...相同版本的 IE
  • @LordScree - 不幸的是没有。有人告诉我,它暂时运行得很好,稍后再回来。发生这种情况的几率是多少?哈哈哈。
  • @MattGrande 我也得到了有趣的结果,在文件下载失败后,如果你按“打开”,它会打开 ASP.NET 页面的实际呈现的 HTML 源代码(例如 等),而不是 CSV 文件,但如果您按“保存”然后“打开”,它会正确保存 CSV 并打开它。我把这种行为归结为 AJAX,但我认为......仍然很烦人。
  • 聚会迟到了,但是有没有人能用这种方法解决它? support.microsoft.com/en-us/kb/2549423

标签: asp.net-mvc internet-explorer filecontentresult


【解决方案1】:

我能够通过修改 URL 来“欺骗”IE 做正确的事情。这有点骇人听闻,但这是细节。 HTH。

作为一名优秀的 MVC 编码器,我使用 Url.Action() 在我的视图中生成到我的控制器操作的正确链接。结果是“/Subscription/DownloadArchive”,我也遇到了同样的问题。 (我正在流式传输一个 ZIP 文件,但它似乎与您的 CSV 文件没有什么不同。) 刚才一时兴起,在阅读了您的帖子后,我将 URL 硬编码为“/Subscription/DownloadArchive/Archive.zip”。我忽略了代码中的“Archive.zip”,但这实际上是我从控制器操作返回的文件名。

快!

【讨论】:

    【解决方案2】:

    我有同样的问题,无法提供好的解决方案(除了 Tood 建议的,一个选项)。但看看 fiddler & co. 的情况,我有更多信息可能会有所帮助。

    我们的应用程序正在动态创建 PDF 文档并提供下载。该问题显然与数据有关,这意味着某些生成的文件在第一次尝试时下载良好,而另一些则需要重试。

    据我所知,Fiddler 显示每次访问时服务器的响应都是相同的。然而,请求有所不同(样本略有编辑):

    第一个请求:

    GET http://localhost:12345/Item/PDF/id HTTP/1.1
    Accept: text/html, application/xhtml+xml, */*
    Referer: ...
    Accept-Language: ...
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
    Accept-Encoding: gzip, deflate
    Host: localhost:12345
    Connection: Keep-Alive
    Cookie: ASP.NET_SessionId=52znkt1fcisrolj44tnuyzu4
    

    第二次请求:

    GET http://localhost:12345/Item/PDF/id HTTP/1.1
    Accept: */*
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
    Host: localhost:12345
    Connection: Keep-Alive
    Cookie: ASP.NET_SessionId=52znkt1fcisrolj44tnuyzu4
    

    请注意,第二个请求如何将“Accept:”标头缩减为 */*。我不愿意为 URL 添加文件扩展名的原因是建议的下载名称是从项目数据生成的,与响应一起提交,否则与 ID 完全无关。

    【讨论】:

    • 嗯,这很有趣。我得回头再看一遍。
    • 我在 IE 11 中遇到了同样的问题。我在 Fiddler 中看到了同样的结果。我的过程是从本地系统打开一个文本文件并编辑它或从头开始创建一个。我能想到的最好的解决方法是在文件名中添加一个时间戳,比如filename.timestamp.txt,然后它就可以正常工作了。
    【解决方案3】:

    我遇到了同样的问题,但是如果我将 Visual Studio 开发服务器的端口号更改为另一个,那么这个问题就消失了。

    【讨论】:

      【解决方案4】:

      这行得通..

      Response.Clear();
      Response.ClearHeaders();
      Response.ClearContent(); 
      Server.ScriptTimeout = 3000;
      Response.AppendHeader("Content-Disposition:", "attachment; filename=" + fileName);
      Response.ContentType = "application/x-msdownload";
      excelFile.SaveXls(Response.OutputStream);  
      Response.Flush();
      HttpContext.Current.ApplicationInstance.CompleteRequest();
      // Response.Close();
      Response.End();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        相关资源
        最近更新 更多