7

所以我FileContentResult从这样的动作中返回一个:

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

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

第一次单击打开时如何允许用户打开文件?

4

4 回答 4

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 完全无关。

于 2013-08-01T15:19:48.217 回答
2

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

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

快!

于 2013-02-13T21:42:16.260 回答
0

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

于 2013-04-16T03:39:52.593 回答
0

这有效..

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();
于 2017-08-17T14:24:50.320 回答