2011-03-01 195 views
4

我目前正在嘗試實現一個控制器,您可以從(更具體地說是jar-archives)下載文件。這些文件存儲在磁盤上而不是數據庫中。到目前爲止,我已經拿出了這個:從ASP.NET MVC 2網站下載文件

public FilePathResult GetFile(String fileName) 
{  
    return File(Path.Combine(Server.MapPath("~/App_Data/Bundles"), fileName), "application/java-archive"); 
} 

沒有意識到缺乏錯誤處理等在這個時候。文件會以這種方式下載,但它會得到錯誤的名稱。例如,替代「sample.jar」,文件獲取控制器名稱「GetFile」(不帶擴展名)。

關於我在做什麼的錯誤?

+0

的'內容Disposition'頭文件下載選項告訴瀏覽器使用的文件名。 –

回答

8

使用允許您指定fileDownloadName的超載。

return File(Path.Combine(Server.MapPath("~/App_Data/Bundles"), fileName), 
      "application/java-archive", 
      fileName); 
+0

謝謝,工作完美! –

1

File有一個重載版本,我的意思是你必須添加第三個參數的文件名。

return File(Path.Combine(Server.MapPath("~/App_Data/Bundles"), fileName), 
     "application/java-archive", "putFileNamehere.extension"); 

現在,putFileNamehere.extension將顯示在文件下載對話框的用戶。

2

如果他們只是存儲在磁盤上,除了服務他們之外你什麼也沒做,爲什麼使用控制器路由它們呢?例如,您應該將它們放在~/Content/Bundles中,並直接鏈接到它們。

然後,您不必擔心filename參數上的所有額外錯誤/安全處理。通常,直接從App_Data提供文件是一種不好的做法,因爲通常這是不應共享的文件的位置。

+0

+1。實際上並沒有回答他的問題,但無論如何要問好! –

+1

@ Craig-Stuntz從技術上講,他問:「我在做什麼錯誤的任何想法?」 ;-) – jbtule

+0

好點,也是一個正確的答案。但是,隨着時間的推移,將會使用id-nr而不是文件名進行請求。 –