ASP.NET MVC 通过 FileResult 向浏览器发送文件

  在 Controller 中我们可以使用 FileResult 向客户端发送文件。

  FileResult

  FileResult 是一个抽象类,继承自 ActionResult。在 System.Web.Mvc.dll 中,它有如上三个子类,分别以不同的方式向客户端发送文件。

  在实际使用中我们通常不需要直接实例化一个 FileResult 的子类,因为 Controller 类已经提供了六个 File 方法来简化我们的操作:

protected internal FilePathResult File(string fileName, string contentType);

protected internal virtual FilePathResult File(string fileName, string contentType, string fileDownloadName);

protected internal FileContentResult File(byte[] fileContents, string contentType);

protected internal virtual FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName);

protected internal FileStreamResult File(Stream fileStream, string contentType);

protected internal virtual FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName);  FilePathResult

  FilePathResult 直接将磁盘上的文件发送至浏览器:

  1. 最简单的方式public ActionResult FilePathDownload1()

{

var path = Server.MapPath("~/Files/鹤冲天.zip");

return File(path, "application/x-zip-compressed");

}

  第一个参数指定文件路径,第二个参数指定文件的 MIME 类型。用户点击浏览器上的下载链接后,会调出下载窗口:

  大家应该注意到,文件名称会变成 Download1.zip,默认成了 Action 的名字。我们使用 File 方法的第二个重载来解决文件名的问题:

  2. 指定 fileDownloadNamepublic ActionResult FilePathDownload2()

{

var path = Server.MapPath("~/Files/鹤冲天.zip");

return File("g:\\鹤冲天.zip", "application/x-zip-compressed", "crane.zip");

}

public ActionResult FilePathDownload3()

{

var path = Server.MapPath("~/Files/鹤冲天.zip");

var name = Path.GetFileName(path);

return File(path, "application/x-zip-compressed", name);

}

  我们可以通过给 fileDownloadName 参数传值来指定文件名,fileDownloadName 不必和磁盘上的文件名一样。下载提示窗口分别如下:

  FilePathDownload2 没问题,FilePathDownload3 还是默认为了 Action 的名字。原因是 fileDownloadName 将作为 URL 的一部分,只能包含 ASCII 码。我们把 FilePathDownload3 改进一下:

  3. 对 fileDownloadName 进行 Url 编码public ActionResult FilePathDownload4()

{

var path = Server.MapPath("~/Files/鹤冲天.zip");

var name = Path.GetFileName(path);

return File(path, "application/x-zip-compressed", Url.Encode(name));

}

  再试下,下载窗口如下:

  好了,没问题了。上面代码中 Url.Encode(…),也可使用 HttpUtility.UrlEncode(…),前者在内部调用后者。

  我们再来看 FileContentResult。

  FileContentResult

  FileContentResult 可以直接将 byte[] 以文件形式发送至浏览器(而不用创建临时文件)。参考代码如下:

public ActionResult FileContentDownload1()

{

byte[] data = Encoding.UTF8.GetBytes("欢迎访问 鹤冲天 的博客 http://www.cnblogs.com/ldp615/");

return File(data, "text/plain", "welcome.txt");

}

  点击后下载链接后,弹出提示窗口如下:

  FileStreamResult

  想给 FileStreamResult 找一个恰当的例子是不太容易的,毕竟 Http Response 中已经包含了一个输出流,如果要动态生成文件的话,可以直接向这个输出流中写入数据,效率还高。当然,我们不会在 Controller 中直接向 Response 的 OutputStream 写入数据,这样做是不符合MVC的,我们应该把这个操作封装成一个 ActionResult。

  不过仔细想想,用途还是有的,比如服务器上有个压缩(或加密)文件,需要解压(或解密)后发送给用户。

  1. 解压(或解密)

  演示代码如下,解压使用 ICSharpCode.SharpZipLib.dll:

public ActionResult FileStreamDownload1()

{

var path = Server.MapPath("~/Files/鹤冲天.zip");

var fileStream = new FileStream(path, FileMode.Open);

var zipInputStream = new ZipInputStream(fileStream);

var entry = zipInputStream.GetNextEntry();

return File(zipInputStream, "application/pdf", Url.Encode(entry.Name));

}

  简单起见,假定压缩文件中只有一个文件,且是 pdf 格式的。鹤冲天.zip 如下:

  点击后弹出下载提示窗口如下:

  2. 转发(或盗链)

  FileStreamResult 的另一种用途是将其它网站上的文件作为本站文件下载(其实就是盗链):

public ActionResult FileStreamDownload1()

{

var stream = new Web
Client().OpenRead("http://files.cnblogs.com/ldp615/Mvc_TextBoxFor.rar");

return File(stream, "application/x-zip-compressed", "Mvc_TextBoxFor.rar");

}

  看下面提示窗口,来源还是 localhost:

时间: 2024-11-01 23:21:54

ASP.NET MVC 通过 FileResult 向浏览器发送文件的相关文章

ASP.NET MVC中使用uploadify上传文件

课程设计需要实现上传文件模块,本来ASP.NET是有内置的控件,但是ASP.NET MVC没有,所以就有两种方 法:自定义和采用第三方插件.由于时间的关系,故采用第三方插件:uploadify. uploadify的使用必 须下载相应的文件,下载地址:http://www.uploadify.com/download/. 先是视 图: <asp:Content ID="Content3" ContentPlaceHolderID="head" runat=&q

ASP.NET MVC如何向浏览器发送文件以提供文件下载功能

文件下载一般都是需要一个文件选择对话框来选择存放文件的地方.我们可以自己做一个, 但简单的方面就是利用浏览器的现成功能. 所有的浏览器都包括文件下载功能,但文件选择对话框却 不是每个浏览器都有提供.这里我只选择我常用的两个浏览器:谷歌浏览器和搜狗浏览器. 先来一个 小例子: public ActionResult Index() { var path = Server.MapPath("~/frog.jpg.jpg"); return File(path, "iamge/jp

MVC后台Controller向客户端浏览器发送文件

问题描述 数据是我从数据库获取得到datatable,并转换为html的table代码想将这些html数据以excel方式发送给前台,让用户下载我用的是FileResult返回的,前台可以alert出这些html代码,但是无法下载xls文件,这是怎么回事呢?后台代码publicFileResultExcelExport(){stringcontent=GetExcelContent();byte[]fileContents=Encoding.UTF8.GetBytes(content);retu

Asp.net MVC 1.0 RTM中实现文件上传

在我们开始之前,你需要知道一个form以post方式上传文件的方式,你将要增加一个特别的enctype attribute到form标签上,为了这个么,我们需要创建一个像这样的form标签: <% using (Html.BeginForm("Edit", "Person", FormMethod.Post, new { enctype = "multipart/form-data" })) {%> 然后我们只需要增加一个Type为&

ASP.NET MVC:Razor 引入命名空间

原文:ASP.NET MVC:Razor 引入命名空间 页面中引用 c# @using MvcApplication83.Models @using MvcApplication83.Common 行尾不需要加分号,加上也无妨(不过得全加上). VB.Net @Imports MvcApplication83.Models @Imports MvcApplication83.Common 配置文件中引用 必须在 Views 文件夹中的 Web.config 文件中添加引用.见下图: 打开该文件,

asp.net-ASP.NET mvc 输出FileResult抛异常求解

问题描述 ASP.NET mvc 输出FileResult抛异常求解 我要输出一个FileResult 最终返回的是File(filename, contentType,downloadname); 其中filename为一个网络路径http:/192.168.22.184:8088/f/xxx.txt 然而抛出了异常:"http:/172.16.22.184:8088/f/xxx.txt"不是有效的虚拟路径 求解 注意:文件和iis不在同一服务器 解决方案 不用用url,如果你的 x

asp.net mvc实现简单的实时消息推送_实用技巧

因为项目需要,需要在网页上实现消息的推送.在百度上搜索了一下,发现实现网页上的消息推送,可以使用asp.net 中的SignalR类库,当然也可以使用H5的WebSocket  Ajax的轮回.当然此处我们使用asp.net 中的SignalR类库.因为它可以实现网页上消息的实时推送.什么是实时推送呢,我简单的说一下我个人的理解吧.实时:在同一时间类发生的事情,当然在计算机中并不是绝对的实时,因为CPU在同一时间片只能处理一个任务,那么这个时候疑问又来了? 我们平时使用电脑又上网,又听音乐是如何

ASP.NET MVC 5 - 视图

原文:ASP.NET MVC 5 - 视图 在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所引入的Razor视图引擎(Razor view engine).Razor视图模板文件使用.cshtml文件扩展名,并提供了一个优雅的方式来使用C#语言创建所要输出的HTML.用Razor编写一个视图模板文件时,将所需的字符和键盘敲击数量降到了最低,并实现

Asp.net Mvc Framework 十一 (自定义Helper在MVC中的使用)

Monorail中的Helper是绑定在Controller上的 形如: [Helper(typeof(ChHelper))] abstract public class BaseBlockController : SmartDispatcherController{ }但本身Helper是使用在View中的,所以 Monorail这种定义方式 略微违背了分离之道 那么Asp.net MVC中是如何绑定自定义的Helper的呢? 其实Asp.net MVC的View也有代码文件即类似 index