当前位置 > 首页 > Asp.net

了解ASP.NET MVC几种ActionResult的本质:FileResult

8/14/2012 8:42:00 AM来源:Asp.net

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中的实现。


  • SharePoint流言终结者:一个文档库里面的文件数量不能超过2000吗?

    4/12/2010 12:16:00 PM

    在SharePoint平台上的众多流言中,这一定是流传得最广的流言之一:不要在一个文档库中存放超过2000个的文件(对应到列表,可以被描述成:不要在一个列表中存放超过2000个列表项)。

  • C # 如何实现多继承

    6/16/2009 2:24:00 AM

    C # 如何实现多继承,关键在于接口可以写方法的实现