Mvc 下载文件
你如何將文件傳送給用戶取決于你最開(kāi)始如何存儲(chǔ)它,如果你將文件存入數(shù)據(jù)庫(kù),你會(huì)用流的方式將文件返還給用戶,如果你將文件存在硬盤中,你只需要提供一個(gè)超鏈接即可,或者也可以以流的方式。每當(dāng)你需要以流的方式將文件送到瀏覽器中,你都的使用到File()方法的重載(而不是使用我們先前一直使用的View()方法),對(duì)于File()方法有3類返回類型:FilePathResult,FileContentResult和FileStreamResult,第一種類型用于直接從磁盤返回文件;第二種類型用于將byte數(shù)組返回客戶端;而第三種方式將已經(jīng)生成并打開(kāi)的流對(duì)象的內(nèi)容返回客戶端。
如果我們將上傳的文件存入了數(shù)據(jù)庫(kù),并以byte數(shù)組的形式存入FileContent域內(nèi).而當(dāng)需要提取時(shí),它仍然會(huì)以一個(gè)byte數(shù)組進(jìn)行提取,這意味著我們使用返回FileContentResult的File()重載,如果我們想讓提取的文件名更有意義,我們使用接受3個(gè)參數(shù)的重載,三個(gè)參數(shù)是:byte數(shù)組,MIME類型,文件名:
?Code
public FileContentResult GetFile(int id) {SqlDataReader rdr; byte[] fileContent = null; string mimeType = "";string fileName = "";const string connect = @"Server=.\SQLExpress;Database=FileTest;Trusted_Connection=True;";using (var conn = new SqlConnection(connect)){var qry = "SELECT FileContent, MimeType, FileName FROM FileStore WHERE ID = @ID";var cmd = new SqlCommand(qry, conn);cmd.Parameters.AddWithValue("@ID", id);conn.Open();rdr = cmd.ExecuteReader();if (rdr.HasRows){rdr.Read();fileContent = (byte[])rdr["FileContent"];mimeType = rdr["MimeType"].ToString();fileName = rdr["FileName"].ToString();}}return File(fileContent, mimeType, fileName); }?
在View中最簡(jiǎn)單的使用來(lái)使用這個(gè)Action只需提供一個(gè)超鏈接:
<a href="/GetFile/1">Click to get file</a>?
如果在數(shù)據(jù)庫(kù)中存儲(chǔ)的圖片是圖片類型,和使用超鏈接不同的是,我們通過(guò)指向Controller action的一個(gè)帶有src屬性的<image>標(biāo)簽來(lái)獲取:
?
下面再讓我們來(lái)看看使用FilePathResult(用于從硬盤提取文件)是多簡(jiǎn)單的事:
?Code
public FilePathResult GetFileFromDisk() {string path = AppDomain.CurrentDomain.BaseDirectory +"uploads/";string fileName = "test.txt";return File(path +fileName, "text/plain", "test.txt"); }?
而這也可以用過(guò)超鏈接提取:
?
而最后一個(gè)選擇FileStreamResult也可以從磁盤中提取文件:
?Code
public FileStreamResult StreamFileFromDisk() {string path = AppDomain.CurrentDomain.BaseDirectory +"uploads/";string fileName = "test.txt";return File(new FileStream(path + fileName, FileMode.Open), "text/plain", fileName); }?
FilePathResult和FileStreamResult的區(qū)別是什么?我們又該如何取舍呢?主要的區(qū)別是FilePathResult使用HttpResponse.TransmitFile來(lái)將文件寫入Http輸出流。這個(gè)方法并不會(huì)在服務(wù)器內(nèi)存中進(jìn)行緩沖,所以這對(duì)于發(fā)送大文件是一個(gè)不錯(cuò)的選擇。他們的區(qū)別很像DataReader和DataSet的區(qū)別。于此同時(shí), TransmitFile還有一個(gè)bug,這可能導(dǎo)致文件傳到客戶端一半就停了,甚至無(wú)法傳送。而FileStreamResult在這方面就很棒了。比如說(shuō):返回Asp.net Chart 控件在內(nèi)存中生成的圖表圖片,而這并不需要將圖片存到磁盤中.
轉(zhuǎn)載于:https://www.cnblogs.com/kongfl888/p/3377437.html
總結(jié)
- 上一篇: #100天计划# 2013年10月14日
- 下一篇: 习题二(3)