2013-10-16 255 views
37

我有一個MVC項目,它會向用戶顯示一些文檔。這些文件當前存儲在Azure blob存儲中。眼下在瀏覽器中打開文件而不是下載文件

[GET("{zipCode}/{loanNumber}/{classification}/{fileName}")] 
public ActionResult GetDocument(string zipCode, string loanNumber, string classification, string fileName) 
{ 
    // get byte array from blob storage 
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName); 
    string mimeType = "application/octet-stream"; 
    return File(doc, mimeType, fileName); 
} 

,當用戶點擊類似下面的鏈接:

目前,該文件是從以下控制器動作檢索

<a target="_blank" href="http://...controller//GetDocument?zipCode=84016&loanNumber=12345678classification=document&fileName=importantfile.pdf 

然後,將文件下載到他們瀏覽器的下載文件夾。我想要發生的事情(我認爲是默認行爲)是讓文件簡單地顯示在瀏覽器中。

我已經嘗試更改mimetype並將返回類型更改爲FileResult而不是ActionResult,兩者都無濟於事。

如何讓文件在瀏覽器中顯示而不是下載?

+3

相當肯定的瀏覽器決定如何處理基礎上,mime類型的文件。 http://www.webmaster-toolkit.com/mime-types.shtml – Tommy

+0

這就是我所懷疑的,所以我嘗試了與.pdf相關的各種mimetypes並嘗試打開文件,但每次都下載。當我在瀏覽器窗口中打開的其他網站上查看其他pdf時。 – Trevor

+2

內容處理標題的價值是什麼? –

回答

76

感謝所有答案,解決方案是一個組合他們都是。

首先,因爲我使用的是byte[],所以控制器操作需要爲FileContentResult而不僅僅是FileResult。發現這個要歸功於:What's the difference between the four File Results in ASP.NET MVC

其次,MIME類型不需要是octet-stream。據推測,使用該流會導致瀏覽器下載文件。我不得不改變類型application/pdf。我將需要探索更強大的解決方案來處理其他文件/ MIME類型。

第三,我不得不添加一個標題,將content-disposition更改爲inline。使用this post我發現我不得不修改我的代碼以防止重複標題,因爲內容處置已被設置爲attachment

的成功代碼:

public FileContentResult GetDocument(string zipCode, string loanNumber, string classification, string fileName) 
{ 
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName); 
    string mimeType = "application/pdf" 
    Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName); 
    return File(doc, mimeType); 
} 
+14

更強大的解決方案獲得mimetype:'返回文件(doc,MimeMapping.GetMimeMapping(fileName));' – Trevor

+1

真棒你解決了。我在上面的註釋中提供的鏈接將允許您根據MimeTypes的文件擴展名創建一個字典。然後,只需創建一個靜態函數,該文件接受一個文件擴展名,併爲您期望的任何文件(我可能不會覆蓋.crt)返回一個MIME類型。如果沒有找到擴展名,則返回標準* application/octet-stream * – Tommy

+1

像魅力一樣工作!最佳解決方案 – Khateeb321

3

瀏覽器應根據MIME類型決定下載或顯示。

試試這個:

string mimeType = "application/pdf"; 
12

它看起來像別人問過類似的問題,前一陣子:

how to force pdf files to open in a browser

一個答案說你應該使用標題:

Content-Disposition: inline; filename.pdf 
+0

好的,所以不幸我嘗試了這個,不得不按照鏈接帖子中的步驟操作,但它仍然不起作用。我嘗試將返回類型更改爲FileContentResult,但這也沒有幫助。 – Trevor

+1

這絕對是解決方案的一部分,謝謝! – Trevor

+1

np,很高興它解決了 – welegan

相關問題