撐到大三了,結果發現周圍的同窗更加墮落了,尤爲是某些人,表面上看起來很認真,實際上三天打魚,兩天曬網,結果一事無成,卻還要抱怨學校教育失敗。數組
爲了吸收他們的教訓,就算是一個小小的編碼問題,我也要努力解決。由於學習的機會一貫都在,只是本身有沒有去努力而已。瀏覽器
以前作個班級站點的課程設計,用一天半的時間作完雖然各方面不咋樣,但麻雀雖小,五臟俱在,功能流程仍是挺完整的。服務器
就算是一個小小的課程設計,在這短暫的時間內,也遇到了很多問題,有大有小。app
先說文件下載這塊。學習
文件下載通常都是須要一個文件選擇對話框來選擇存放文件的地方。咱們能夠本身作一個,但簡單的方面就是利用瀏覽器的現成功能。編碼
全部的瀏覽器都包括文件下載功能,但文件選擇對話框卻不是每一個瀏覽器都有提供。這裏我只選擇我經常使用的兩個瀏覽器:谷歌瀏覽器和搜狗瀏覽器。spa
先來一個小例子:設計
public ActionResult Index() { var path = Server.MapPath("~/frog.jpg.jpg"); return File(path, "iamge/jpeg"); }
這裏是下載工程根目錄下的frog.jpg.jpg。
代碼很是簡短,只有兩行,但效果卻不差:3d
這是搜狗瀏覽器上的效果,若是是谷歌瀏覽器,則是直接下載下來,可是文件並非咱們的文件名,甚至格式也不同,就是一個奇怪的名爲"下載"的文件。code
首先是解釋上面兩行代碼的原理:
Server.MapPath()的參數是一個虛擬路徑的,它的原理是根據提供的虛擬路徑返回一個虛擬路徑對應的物理路徑,並且參數路徑必須是虛擬路徑。咱們服務器上傳的文件都是放在服務器的一個路徑下,這個路徑是物理路徑,可是打開文件的URL倒是虛擬路徑,這樣的好處就像是相對路徑和絕對路徑的對比,想一想若是咱們將文件的額存放地點放在另外一個地方,若是URL爲物理路徑,那麼就會找不到該文件。
path如今是frog.jpg.jpg的物理路徑,而後咱們要將該文件發送給瀏覽器,則須要利用FilePathResult的File(),指定發送文件的物理路徑和格式就能夠了。
值得注意的是,若是是在搜狗中,指定格式是application/x-zip-compressed(zip的MIME格式)或者application/octet-stream(rar的MIME格式),在網頁上看到的將會是亂碼,但若是是谷歌,依然是上面那樣的狀況,可是用壓縮文件軟件打開,就會發現裏面就是咱們要的文件,它確實是被下載下來了。
因爲谷歌瀏覽器的行爲與咱們想要的效果差了太遠了,因此下面就再也不討論谷歌瀏覽器的行爲。
我用word文檔,Excel表格和txt文檔格式的文件分別發送給瀏覽器,結果只有txt文檔的文件中的內容可以正常顯示在網頁中,其餘都是亂碼,可見,網頁可以直接打開的文件格式是有限的,至少須要第三方軟件打開的文件是沒法打開的。
上面這些都不是重點,只是個人一點好奇心而已。如今咱們進入重點,就是讓瀏覽器提供下載對話框。
要實現這樣的功能,上面的代碼是不行的,至少我這邊是不行的,要用下面的代碼:
var path = Server.MapPath("~/1.txt"); var name = Path.GetFileName(path); return File(path, "application/zip-x-compressed", name);
而後瀏覽器的運行效果如:
這就是咱們想要的結果。
咱們增長了一行代碼,就是使用Path.GetFileName()來獲取指定物理路徑的文件的文件名和擴展名,而後再在File()中增長一個新的參數,該參數就是咱們要下載的文件的文件名和擴展名。
但可怕的是,上面代碼中File的格式能夠隨便指定,甚至能夠直接爲"1"(只要不是null以及""),都會提供上面的下載對話框!!這告訴咱們,該下載對話框須要的並非文件的正確格式,它須要的僅僅只是須要下載的文件的文件名(這個文件名並必定要是正確的文件名,咱們能夠指定新的名字,反正它就只要將該物理路徑下的那個文件下載下來就行)以及該文件的物理路徑。
必須注意的是,若是文件名包含有中文,那麼它就會顯示這樣的效果:
若是想要顯示正確的中文文件名,咱們能夠這樣作:
return File(path, "1", Url.Encode(name));
效果就會這樣:
要實現上面的效果,咱們還能夠這樣作:
byte[] data = Encoding.UTF8.GetBytes("~/中國.txt"); return File(data, "1", Url.Encode("中國.txt"));
這裏咱們是直接將"~/中國.txt"變爲byte[]數組而後發給瀏覽器,保存在中國.txt中,打開就是"~/中國.txt"。這種方式屬於FileContentResult。
大概的內容就是上面這樣,固然咱們能夠自定義,畢竟像是谷歌瀏覽器根本就不提供下載對話框的狀況下,更加須要咱們自定義下載對話框,但這裏不講,先是這樣,之後再繼續補充。