MVC FileResult


你如何將文件傳送給用戶取決於你最開始如何存儲它,如果你將文件存入數據庫,你會用流的方式將文件返還給用戶,如果你將文件存在硬盤中,你只需要提供一個超鏈接即可,或者也可以以流的方式。每當你需要以流的方式將文件送到瀏覽器中,你都的使用到File()方法的重載(對於File()方法有3類返回類型:FilePathResult,FileContentResult和FileStreamResult,第一種類型用於直接從磁盤返回文件;第二種類型用於將byte數組返回客戶端;而第三種方式將已經生成並打開的流對象的內容返回客戶端。

如果你還記得的話,我們將上傳的文件存入了數據庫,並以byte數組的形式存入FileContent域內.而當需要提取時,它仍然會以一個byte數組進行提取,這意味着我們使用返回FileContentResult的File()重載,如果我們想讓提取的文件名更有意義,我們使用接受3個參數的重載,三個參數是:byte數組,MIME類型,文件名:

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>標簽來獲取:

<img src="/GetFile/1" alt="My Image" />

下面再讓我們來看看使用FilePathResult(用於從硬盤提取文件)是多簡單的事:

public FilePathResult GetFileFromDisk()
{
  string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/"; string fileName = "test.txt"; return File(path + fileName, "text/plain", "test.txt"); }

而這也可以用過超鏈接提取:

<a href="/GetFileFromDisk">Click to get file</a>

而最后一個選擇FileStreamResult也可以從磁盤中提取文件:

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 控件在內存中生成的圖表圖片,而這並不需要將圖片存到磁盤中.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM