2012-03-07 94 views
6

所以我是从这样一个动作返回FileContentResult在Internet Explorer中的“文件无法下载”与ASP.NET MVC

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

当点击IE浏览器中的“打开”(我使用IE9,版本9.0.8112.16421),它说“文件无法下载”,用户会看到一个“重试”按钮。如果他们点击重试,它可以正常工作。如果他们点击保存,它工作正常。在Firefox中,它工作正常。

如何让用户在第一次打开时允许用户打开文件?

+0

什么版本的IE? – Joe 2012-03-07 22:12:13

+0

我已更新该问题。 – 2012-03-08 14:01:39

+0

安装fiddler并让它在您发出第一个请求时运行。您将能够检查从服务器返回的响应。也许这会对这个问题有所了解。 http://www.fiddler2.com/fiddler2/ – Joe 2012-03-08 17:24:45

回答

2

我可以通过修改URL来“欺骗”IE来做正确的事情。这有点哈克,但这是细节。 HTH。

作为一个很好的MVC编码器,我使用Url.Action()在我的视图中为我的控制器动作生成正确的链接。结果是“/ Subscription/DownloadArchive”,我有同样的问题。 (我正在下载一个ZIP文件,但它看起来和你的CSV没什么区别。)在阅读你的文章后,我突然想到了,我将URL硬编码为“/Subscription/DownloadArchive/Archive.zip”。我忽略了代码中的“Archive.zip”,但这实际上是我从控制器操作返回的文件名。

Presto!

0

我有同样的问题,但如果我将Visual Studio Development Server的端口号更改为另一个,则此问题消失。

2

我有同样的问题,不能提供一个很好的解决方案(除了特德建议,其中是一个选项)。但看着提琴手&有限公司的情况,我有更多的信息可能有所帮助。

我们的应用程序正在创建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 

笔记,所述第二请求是如何减少 '接受:' 标题只是*/*。我不愿意向Url添加文件扩展名的原因是建议的下载名称是从项目数据生成的,与响应一起提交,否则与ID完全无关。

+0

嗯,这很有趣。我必须回过头来再看一下。 – 2013-09-05 13:00:34

+0

我遇到了与IE 11相同的问题。我在Fiddler中看到了相同的结果。我的过程是从本地系统打开一个文本文件并对其进行编辑或从头创建一个。我能想出的最佳解决方法是为文件名添加一个时间戳,例如'filename.timestamp.txt',并在此后正常工作。 – JabberwockyDecompiler 2015-04-06 16:57:31

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(); 
相关问题