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

FileResult是一个基于文件的ActionResult,利用FileResult我们可以很容易地将从某个物理文件的内容响应给客户端。ASP.NET MVC定义了三个具体的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是一个不错的选择。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 文件
, 内容
, 属性
, public
, Response WriteFile
, 一个
contentType属性
,以便于您获取更多的相关知识。

时间: 2024-08-22 14:11:48

了解ASP.NET MVC几种ActionResult的本质:FileResult的相关文章

了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult

定义在Controller中的Action方法大都返回一个ActionResult对象.ActionResult是对Action执行结果的封装,用于最终对请求进行响应.ASP.NET MVC提供了一系列的ActionResult,它们本质上是通过怎样的方式来响应请求的呢?这是这个系列着重讨论的主题.[本文已经同步到<How ASP.NET MVC Works?>中] 目录 一.ActionResult对请求的响应 二.EmptyResult 三.ContentResult 四.实例演示:执行返

了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult &amp; JsonResult

在之前的两篇文章(<EmptyResult & ContentResult>和<FileResult>)我们剖析了EmptyResult.ContentResult和FileResult这三种ActionResult是如何将Action执行的结果响应给客户端的.本篇文章着重介绍在进行Ajax调用中经常使用的两个ActionResult,即JavaScriptResult和JsonResult.[本文已经同步到<How ASP.NET MVC Works?>中]

了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResult &amp; RedirectResult/RedirectToRouteResult

在本系列的最后一篇,我们来讨论最后三个ActionResult:HttpStatusCodeResult.RedirectResult和RedirectToRouteResult .第一个用于实现针对某个HTTP状态的响应,而后两个用于实现重定向.至于重定向,又分为"暂时重定向"和"永久重定向",按照响应状态,又称"302重定向"和"301重定向".[本文已经同步到<How ASP.NET MVC Works?>中

了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult &amp;amp; JsonResult

在之前的两篇文章(<EmptyResult & ContentResult>和<FileResult>)我们剖析了EmptyResult.ContentResult和FileResult这三种ActionResult是如何将Action执行的结果响应给客户端的.本篇文章着重介绍在进行Ajax调用中经常使用的两个ActionResult,即JavaScriptResult和JsonResult. 一.JavaScriptResult JavaScriptResult使我们可以

了解ASP.NET MVC几种ActionResult的本质:EmptyResult &amp;amp; ContentResult

定义在Controller中的Action方法大都返回一个ActionResult对象.ActionResult是对Action执行结果的封装,用于最终对请求进行响应.ASP.NET MVC提供了一系列的ActionResult,它们本质上是通过怎样的方式来响应请求的呢?这是这个系列着重讨论的主题. 一.ActionResult对请求的响应 HTTP是一个单纯的采用请求/回复消息交换模式的网络协议,Web服务器在接收并处理来自客户端的请求后会根据处理结果对请求予以响应.对于来自客户端的访问请求,

了解ASP.NET MVC几种ActionResult的本质 第四篇

HttpStatusCodeResult & RedirectResult/RedirectToRouteResult 在本系列的最后一篇,我们来讨论最后三个ActionResult:HttpStatusCodeResult.RedirectResult和RedirectToRouteResult .第一个用于实现针对某个HTTP状态的响应,而后两个用于实现重定向.至于重定向,又分为"暂时重定向"和"永久重定向",按照响应状态,又称"302重定向&

ASP.NET MVC的运行机制

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.

How ASP.NET MVC Works?

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.

一起谈.NET技术,13个不可不知的ASP.NET MVC扩展点

      ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定,并将其注入到主管线中. 在本文中,我们将从管线开始直到视图呈现,逐一向您展示每个ASP.NET MVC开发者都必须了解13个扩展点. 1.ASP.NET MVC扩展之RouteConstraint 通常情况下你可以使用正则表达式对url参数