將不(bu)確定變(bian)成確定~Uri文本(ben)文件不(bu)用瀏(liu)覽器自動打開,而是(shi)下載(zai)到本(ben)地
這(zhe)個(ge)標題(ti)(ti)(ti)有(you)點長,簡單來說就(jiu)(jiu)是(shi),對(dui)于(yu)一個(ge)文件(jian)下(xia)載來說,是(shi)否可以提(ti)示用戶,讓它去保(bao)存,而不(bu)是(shi)將(jiang)它在(zai)瀏(liu)(liu)覽器中打(da)開,在(zai)瀏(liu)(liu)覽器中打(da)開有(you)個(ge)致(zhi)命問題(ti)(ti)(ti),那就(jiu)(jiu)是(shi),如果你的(de)頁面編碼(ma)和文件(jian)的(de)編碼(ma)不(bu)一致(zhi)時,打(da)開的(de)就(jiu)(jiu)是(shi)亂碼(ma),本文事(shi)實上主要解(jie)決的(de)就(jiu)(jiu)是(shi)這(zhe)個(ge)問題(ti)(ti)(ti)。
上面的URI格式的文(wen)件直接使用瀏覽(lan)器打(da)開,由于文(wen)件編(bian)碼(ma)(ma)是(shi)GB2312而網頁編(bian)碼(ma)(ma)是(shi)UTF-8,所以,頁面上的文(wen)字就變(bian)成了亂碼(ma)(ma)。
知道(dao)了(le)產生問題的(de)根源之后(hou),我(wo)們再(zai)來解決它,首先,我(wo)們沒法(fa)去控(kong)制(zhi)URI上的(de)文件編碼,所以,我(wo)們只能把它讀到本(ben)地(di)(WWW服(fu)務器),然后(hou)再(zai)進行(xing)二次組織,并返(fan)回到客(ke)戶(hu)端(自己(ji)的(de)瀏覽器),對于URI的(de)文件來說,我(wo)們不能直接返(fan)回,必(bi)須把它讀成流之后(hou),再(zai)返(fan)回,其實(shi),.net為我(wo)們已經封裝的(de)很簡便了(le),下面是實(shi)現的(de)代碼,大家看一下:
/// <summary> /// 下載文件(jian),同步支持本地和(he)URI的文件(jian) /// </summary> /// <param name="path"></param> /// <returns></returns> public ActionResult DownLoad(string path) { if (path.IndexOf("//") < 0) { string localPath = Server.MapPath("/" + path); string contentType = MimeMapping.GetMimeMapping(localPath); return File(localPath, contentType, "下載(zai)文件"); } else { HttpWebRequest request = (HttpWebRequest)System.Net.WebRequest.Create(path); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream = response.GetResponseStream(); var contentType = response.ContentType;//獲(huo)得文件(jian)的(de)總大小 return File(stream, contentType, "下載(zai)文件(jian)"); } }
下載是視頻截圖: