2012-03-07 92 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(); 
相關問題