2010-05-19 36 views
1

我有返回這樣如何僅當用戶請求將文件保存在ASP.NET MVC中時才提供fileDownloadName?

return this.File("file.pdf", "application/pdf"); 

的URL一個FileResult控制器動作「/下載/ 322」 - 其中322是該文件的ID。

這很好,所以如果用戶點擊一個PDF鏈接 - 只要他們安裝了PDF插件,它就會在他們的網絡瀏覽器中打開。

但是,如果他們右鍵單擊鏈接並選擇「另存爲...」呢?瀏覽器彈出文件名爲「322.」。我想在這一點上有更好的文件名,通過做這樣的事情:

return this.File("file.pdf", "application/pdf", "file.pdf"); 

但是,如果我改變控制器返回這樣,那麼它會一直彈出下載框,因爲MVC是將Content-Disposition標題設置爲附件(所以我不能嵌入文件)。

總之,我可以以某種方式檢測到用戶正試圖下載文件,而文件只是嵌入在頁面上的某些內容上嗎?

回答

3

您無法確定瀏覽器如何配置爲處理文檔/內容。

例如,可以右鍵單擊HTML文檔中的鏈接,然後選擇「將鏈接另存爲」/「另存目標」並下載該文件。該鏈接可能指向另一個HTML文檔。絕對沒有辦法確定是否發生了。

唯一直接的方法是使用適當的值將參數「filename」的響應的「Content Disposition」指定爲「attachment」。

你的HTML響應應包含以下標題:

Content-Type: whatever/be-it 
Content-Disposition: attachment; filename=FilenameToSaveAs.Ext 

例子:

Content-Type: text/html 
Content-Disposition: attachment; filename=mypage.html 

如果瀏覽器理解這些標題 - 今天他們中的大多數,他們將打開對話框「打開/保存/取消」。

它與Gmail中的「下載附件」圖片類似,否則會在瀏覽器中顯示。

+0

沒錯。好的解釋發生了什麼事。它進一步強化了我必須選擇一種方式。可以將它指定爲附件,或者不要。 – davekaro 2010-05-19 21:18:38

+0

同意你所說的話! – 2010-05-20 05:49:42

0

好了,經過一番思考,我決定每次只提供文件名。唯一的缺點是它會被標記爲附件,因此不會在瀏覽器中加載(相反,用戶將下載該文件)。

另外,我真的不認爲你可以做我以上的要求...所以除非有人有任何其他的想法...我會接受這個答案。

1

發佈另一個答案...因爲格式化不起作用的評論。

我想到了使用JavaScript的一個想法。

對於強制下載:

<a href='downloadFile.ext' 
    onclick="alert('This file cannot be shown, right click, select Save Target As to download'); 
    return false'> 
    Text for link</a> 

對於瀏覽或下載:

<a href="simpleFile.ext">Text for Link</a> 

在第二種情況下,用戶既可以點擊,默認情況下,或右鍵單擊並保存,讓瀏覽器手柄!

相關問題