1. 程式人生 > >瞭解ASP.NET MVC幾種ActionResult的本質:FileResult

瞭解ASP.NET MVC幾種ActionResult的本質:FileResult

FileResult是一個基於檔案的ActionResult,利用FileResult我們可以很容易地將從某個物理檔案的內容響應給客戶端。ASP.NET MVC定義了三個具體的FileResult,分別是FileContentResult、FilePathResult和FileStreamResult。在這篇文章中我們將探討三種具體的FileResult是如何將檔案內容對請求進行響應的。[本文已經同步到《How ASP.NET MVC Works?》中]

目錄
一、FileResult
二、FileContentResult
三、FilePathResult
四、FileStreamResult
五、例項演示:通過FileResult釋出圖片

一、FileResult

如下面的程式碼片斷所示,FileResult具有一個表示媒體型別的只讀屬性ContentType,該屬性在建構函式中被初始化。當我們基於某個物理檔案建立相應的FileResult物件的時候應該根據檔案的型別指定媒體型別,比如說目標檔案是一個.jpg圖片,那麼對應的媒體型別為“image/jpeg”,對於一個.pdf檔案,則採用“application/pdf”。

   1: public abstract class FileResult : ActionResult
   2: {    
   3:     protected
FileResult(string contentType);
   4:     public override void ExecuteResult(ControllerContext context);
   5:     protected abstract void WriteFile(HttpResponseBase response);
   6:     
   7:     public string ContentType { get; }
   8:     public string
FileDownloadName { get; set; }
   9: }

針對檔案的響應具有兩種形式,即內聯(Inline)和附件(Attachment)。一般來說,前者會利用瀏覽器直接開啟響應的檔案,而後者會以獨立的檔案下載到客戶端。對於後者,我們一般會為下載的檔案指定一個檔名,這個檔名可以通過FileResult的FileDownloadName屬性來指定。檔案響應在預設情況下采用內聯的方式,如果需要採用附件的形式,需要為響應建立一個名稱為Content-Disposition的報頭,該報頭值的格式為“attachment; filename={ FileDownloadName }”。

FileResult僅僅是一個抽象類,檔案內容的輸出實現在抽象方法WriteFile中,該方法會在重寫的ExecuteResult方法中呼叫。如果FileDownloadName屬性不為空,意味著會採用附件的形式進行檔案響應,FileResult會在重寫的ExecuteResult方法中進行Content-Disposition響應報頭的設定。如下面的程式碼片斷基本上體現了ExecuteResult方法在FileResult中的實現。

   1: public abstract class FileResult : ActionResult
   2: {
   3:     //其他成員
   4:     public override void ExecuteResult(ControllerContext context)
   5:     {        
   6:         HttpResponseBase response = context.HttpContext.Response;
   7:         response.ContentType = this.ContentType;
   8:         if (!string.IsNullOrEmpty(this.FileDownloadName))
   9:         {
  10:             //生成Content-Disposition響應報頭值
  11:             string headerValue = ContentDispositionUtil.GetHeaderValue(this.FileDownloadName);
  12:             context.HttpContext.Response.AddHeader("Content-Disposition", headerValue);
  13:         }
  14:         this.WriteFile(response);
  15:     }
  16: }

ASP.NET MVC定義了三個具體的FileResult,分別是FileContentResult、FilePathResult和FileStreamResult,接下來我們對它們進行單獨介紹。

二、FileContentResult

FileContentResult是針對檔案內容建立的FileResult。如下面的程式碼片斷所示,FileContentResult具有一個位元組陣列型別的只讀屬性FileContents表示響應檔案的內容,該屬性在建構函式中指定。FileContentResult針對檔案內容的響應實現也很簡單,從如下所示的WriteFile方法定義可以看出,它只是呼叫當前HttpResponse的OutputStream屬性的Write方法直接將表示檔案內容的位元組陣列寫入響應輸出流。

   1: public class FileContentResult : FileResult
   2: {
   3:     public byte[] FileContents { get; }
   4:     public FileContentResult(byte[] fileContents, string contentType) ;
   5:  
   6:     protected override void WriteFile(HttpResponseBase response)
   7:     {
   8:         response.OutputStream.Write(this.FileContents, 0, this.FileContents.Length);
   9:     }    
  10: }
  11:  
  12: public abstract class Controller : ControllerBase, ...
  13: {
  14:     // 其他成員   
  15:     protected FileContentResult File(byte[] fileContents, string contentType);
  16:     protected virtual FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName);
  17: }

抽象類Controller中定義瞭如上兩個File過載根據指定的位元組陣列、媒體型別和下載檔名(可選)生成相應的FileContentResult。由於FileContentResult是根據位元組陣列建立的,當我們需要動態生成響應檔案內容(而不是從物理檔案中讀取)時,FileContentResult是一個不錯的選擇。

三、FilePathResult

從名稱可以看出,FilePathResult是一個根據物理檔案路徑建立FileResult。如下面的程式碼片斷所示,表示響應檔案的路徑通過只讀屬性FileName表示,該屬性在建構函式中被初始化。在實現的WriteFile方法中,FilePathResult直接將檔案路徑作為引數呼叫當前HttpResponse的TransmitFile實現了針對檔案內容的響應。抽象類Controller同樣定義了兩個File方法過載來根據檔案路徑建立相應的FilePathResult。

   1: public class FilePathResult : FileResult
   2: {
   3:     public string FileName { get; }
   4:     public FilePathResult(string fileName, string contentType);
   5:  
   6:     protected override void WriteFile(HttpResponseBase response)
   7:     {
   8:         response.TransmitFile(this.FileName);
   9:     }    
  10: }
  11:  
  12: public abstract class Controller : ControllerBase, ...
  13: {
  14:     //其他成員
  15:     protected FilePathResult File(string fileName, string contentType);
  16:     protected virtual FilePathResult File(string fileName, string contentType, string fileDownloadName);
  17: }

四、FileStreamResult

FileStreamResult允許我們通過一個用於讀取檔案內容的流來建立FileResult。如下面的程式碼片斷所示,讀取檔案流通過只讀屬性FileStream表示,該屬性在建構函式中被初始化。在實現的WriteFile方法中,FileStreamResult通過指定的檔案流讀取檔案內容,並最終呼叫當前HttpResponse的OutputStream屬性的Write方法將讀取的內容寫入當前HTTP響應的輸出流中。抽象類Controller中同樣定義了兩個File方法過載根據檔案讀取流建立相應的FileStreamResult。

   1: public class FileStreamResult : FileResult
   2: {
   3:     public Stream FileStream { get; }
   4:     public FileStreamResult(Stream fileStream, string contentType);    
   5:  
   6:     protected override void WriteFile(HttpResponseBase response)
   7:     {
   8:         Stream outputStream = response.OutputStream;
   9:         using (this.FileStream)
  10:         {
  11:             byte[] buffer = new byte[0x1000];
  12:             while (true)
  13:             {
  14:                 int count = this.FileStream.Read(buffer, 0, 0x1000);
  15:                 if (count == 0)
  16:                 {
  17:                     return;
  18:                 }
  19:                 outputStream.Write(buffer, 0, count);
  20:             }
  21:         }
  22:     }    
  23: }
  24:  
  25: public abstract class Controller : ControllerBase, ...
  26: {
  27:     //其他成員
  28:     protected FileStreamResult File(Stream fileStream, string contentType);
  29:     protected virtual FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName);
  30: }

五、例項演示:通過FileResult釋出圖片

為了讓讀者對FileResult具有更加深刻地認識,我們通過一個例項來演示如何通過FileResult來對外發布圖片。在通過Visual Studio的ASP.NET MVC專案模板建立的空Web應用中,我們在根目錄下新增一個名為images的子目錄來存放釋出的.jpg圖片,然後我們定義如下一個HomeController。

   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Index()
   4:     {
   5:         return View();
   6:     }
   7:  
   8:     public ActionResult Image(string id)
   9:     {
  10:         string path = Server.MapPath("/images/" + id + ".jpg");
  11:         return File(path, "image/jpeg");
  12:     }
  13: }

圖片的釋出體現在Action方法Image上,表示圖片ID的引數同時作為圖片的檔名(不含副檔名)。在該方法中,我們根據圖片ID解析出對應檔案的路徑後,直接呼叫File方法建立一個媒體型別為“image/jpeg”的FilePathResult。在Action方法Index中呈現的View定義如下,我們通過一個列表顯示6張圖片。基於圖片的<img>元素的src屬性指定的地址正是指向定義在HomeController的Action方法Image,指定的表示圖片ID的引數分別是001、002、…、006。

   1: <html>
   2:     <head>
            
           

相關推薦

瞭解ASP.NET MVCActionResult本質EmptyResult & ContentResult

定義在Controller中的Action方法大都返回一個ActionResult物件。ActionResult是對Action執行結果的封裝,用於最終對請求進行響應。ASP.NET MVC提供了一系列的ActionResult,它們本質上是通過怎樣的方式來響應請求的呢?這是這個系列著重討論的主題。[

瞭解ASP.NET MVCActionResult本質FileResult

FileResult是一個基於檔案的ActionResult,利用FileResult我們可以很容易地將從某個物理檔案的內容響應給客戶端。ASP.NET MVC定義了三個具體的FileResult,分別是FileContentResult、FilePathResult和FileStreamResult。在這篇

瞭解ASP.NET MVCActionResult本質JavaScriptResult & JsonResult

在之前的兩篇文章(《EmptyResult & ContentResult》和《FileResult》)我們剖析了EmptyResult、ContentResult和FileResult這三種ActionResult是如何將Action執行的結果響應給客戶端的。本篇文章著重介紹在進行Ajax呼叫中經常

瞭解ASP.NET MVCActionResult本質HttpStatusCodeResult & RedirectResult/RedirectToRouteResult

在本系列的最後一篇,我們來討論最後三個ActionResult:HttpStatusCodeResult、RedirectResult和RedirectToRouteResult 。第一個用於實現針對某個HTTP狀態的響應,而後兩個用於實現重定向。至於重定向,又分為“暫時重定向”和“永久重定向”,按照響應狀態

asp.net MVC繫結下拉列表的寫法

今天寫寫在asp.net MVC中幾種繫結下拉列表的寫法。 1.在前端寫死資料: @Html.DropDownListFor(m=>m.Sex,new SelectList(new List&l

MVC學習系列-WebForm與asp.net MVC設計模式區別、MVC設計模式基礎瞭解

ASP.NET 是一個開發框架,用於通過 HTML、CSS、JavaScript 以及伺服器指令碼來構建網頁和網站。ASP.NET 支援三種開發模式:Web Pages、MVC (Model View Controller) 以及 WebForm。下面首先區別比較一下Web

【翻譯】瞭解ASP.NET MVC的HTML助手

作者:Shailendra Chauhan works as Software Analyst at reputed MNC and has more than 5 years of hand over Microsoft .NET technologies. He is a

Asp.net檔案下載方式

C# code ASP.NET檔案下載 //TransmitFile實現下載 protected void Button1_Click(object sender, EventArgs e) { /* 微軟為Response

ASP.NET MVC常用ActionResult

一、定義 MVC中ActionResult是Action的返回結果。ActionResult 有多個派生類,每個子類功能均不同,並不是所有的子類都需要返回檢視View,有些直接返回流,有些返回字串等。ActionResult是一個抽象類,它定義了唯一的ExecuteResult方法,引數為一個C

ASP.NET MVC 提高運行速度的性能優化方法

服務 排隊 等待 谷歌搜索 部署 lan str run 提高 主要介紹ASP.NETMVC 應用提速的六種方法,因為沒有人喜歡等待,所以介紹幾種常用的優化方法。 大家可能會遇到排隊等待,遇到紅燈要等待,開個網頁要等待,等等等。 理所當然,沒有人喜歡等待網頁慢吞吞地加載

asp.net MVC html.ActionLink的參數格式

class cti span 生成 get 傳遞 文字 targe classname 一 Html.ActionLink("linkText","actionName") 該重載的第一個參數是該鏈接要顯示的文字,第二個參數是對應的控制器的方法, 默認控制器為當前頁面的控制

ASP.NET MVC下自定義錯誤頁和展示錯誤頁的方式

提供服務 one url attribute 運行 16px execute 釋放 namespace 在網站運行中,錯誤是不可避免的,錯誤頁的產生也是不可缺少的。 這幾天看了博友的很多文章,自己想總結下我從中學到的和實際中配置的。 首先,需要知道產生錯誤頁的來源,一種

asp.net MVC從後端傳遞資料到前端的資料形式:ViewBag,ViewData,Model

參考:https://blog.csdn.net/xiaouncle/article/details/77825389 在以上文章的基礎上做點相關補充。 1.ViewBag是一個動態欄位,而ViewData是一個字典 首先看後臺程式碼: public ActionResult T

ASP.NET MVC 檔案上傳和檔案下載 以及 檔案下載的方法

1、序言最近專案中需要用到這個功能點,但是網上下載的時候總是出現亂碼。所以趁著這個時間自己整理出了一份,以後需要的時候就直接看自己的部落格就行了。已經測試過:在谷歌、火狐、IE等瀏覽器上都不會出現亂碼問題。2、結果展示2.1、上傳檔案成功介面 2.2、下載檔案成功介面3、上傳

asp.net MVC前臺View頁面向後臺Controller控制器傳遞資料的方式

上一篇文章Asp.Net MVC中的@model與Model講解了後臺控制器如何向前臺頁面傳遞資料,今天就接著為大家講解前臺View頁面向後臺Controller控制器傳遞資料的幾種方式。這幾種方式是我在實際中使用並總結的,如果那個地方說的不對或有不足之處,歡迎各位指出並給

asp.net mvcActionResult

new 特殊 包含 string 工作 json數據 value orm none Web服務器接收到一個客戶端請求以後,會對請求予以相應,而這個響應是通過Response來控制的, 但是在asp.net mvc 裏,這部分的工作是由ActionResult來完成的,

ASP.NET MVC中有四過濾器類型

std tpc min fsm emc 為什麽 lbp yun eal 在ASP.NET MVC中有四種過濾器類型 Action 1、在ASP.NET MVC項目中,新建文件夾Filter,然後新建類MyCustormFilter,繼承自ActionFilterA

如何在asp.net mvc中添加自定義的HTML輔助方法

步驟 gen 其他 generic url linq build mode 擴展方法 很久沒在博客園發表文章了,今天來總結一下如何在asp.net mvc中添加自定義的HTML輔助方法。我們現在設計這麽一個目前,利用自定義的HTML方法來渲染一個普通的img標記。直接進入主

ASP.NET MVC Filters 4默認過濾器的使用【附示例】

rac model 指定 host 會話 決策 蜘蛛 formate 操作性 過濾器(Filters)的出現使得我們可以在ASP.NET MVC程序裏更好的控制瀏覽器請求過來的URL,不是每個請求都會響應內容,只響應特定內容給那些有特定權限的用戶,過濾器理論上有以下功能:

Asp.Net MVC及Web API框架配置會碰到的個問題及解決方案(轉)

erb his 控制 NPU vat types ror 控制器 動手 前言 剛開始創建MVC與Web API的混合項目時,碰到好多問題,今天拿出來跟大家一起分享下。有朋友私信我問項目的分層及文件夾結構在我的第一篇博客中沒說清楚,那麽接下來我就準備從這些文件怎麽分文件夾說起