Mvc 下载文件
你如何將文件傳送給用戶取決于你最開始如何存儲它,如果你將文件存入數據庫,你會用流的方式將文件返還給用戶,如果你將文件存在硬盤中,你只需要提供一個超鏈接即可,或者也可以以流的方式。每當你需要以流的方式將文件送到瀏覽器中,你都的使用到File()方法的重載(而不是使用我們先前一直使用的View()方法),對于File()方法有3類返回類型:FilePathResult,FileContentResult和FileStreamResult,第一種類型用于直接從磁盤返回文件;第二種類型用于將byte數組返回客戶端;而第三種方式將已經生成并打開的流對象的內容返回客戶端。
如果我們將上傳的文件存入了數據庫,并以byte數組的形式存入FileContent域內.而當需要提取時,它仍然會以一個byte數組進行提取,這意味著我們使用返回FileContentResult的File()重載,如果我們想讓提取的文件名更有意義,我們使用接受3個參數的重載,三個參數是:byte數組,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中最簡單的使用來使用這個Action只需提供一個超鏈接:
<a href="/GetFile/1">Click to get file</a>?
如果在數據庫中存儲的圖片是圖片類型,和使用超鏈接不同的是,我們通過指向Controller action的一個帶有src屬性的<image>標簽來獲取:
?
下面再讓我們來看看使用FilePathResult(用于從硬盤提取文件)是多簡單的事:
?Code
public FilePathResult GetFileFromDisk() {string path = AppDomain.CurrentDomain.BaseDirectory +"uploads/";string fileName = "test.txt";return File(path +fileName, "text/plain", "test.txt"); }?
而這也可以用過超鏈接提取:
?
而最后一個選擇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的區別是什么?我們又該如何取舍呢?主要的區別是FilePathResult使用HttpResponse.TransmitFile來將文件寫入Http輸出流。這個方法并不會在服務器內存中進行緩沖,所以這對于發送大文件是一個不錯的選擇。他們的區別很像DataReader和DataSet的區別。于此同時, TransmitFile還有一個bug,這可能導致文件傳到客戶端一半就停了,甚至無法傳送。而FileStreamResult在這方面就很棒了。比如說:返回Asp.net Chart 控件在內存中生成的圖表圖片,而這并不需要將圖片存到磁盤中.
轉載于:https://www.cnblogs.com/kongfl888/p/3377437.html
總結
- 上一篇: #100天计划# 2013年10月14日
- 下一篇: 习题二(3)