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

FileResult is an abstract base class for all the others.

  • FileContentResult - you use it when you have a byte array you would like to return as a file
  • FilePathResult - when you have a file on disk and would like to return it‘s content (you give a path)
  • FileStreamResult - you have a stream open, you want to return it‘s content as a file

However, you‘ll rarely have to use these classes - you can just use one of Controller.Fileoverloads and let asp.net mvc do the magic for you.

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

public ActionResult FilePathDownload1()
{
    var path = Server.MapPath("~/Files/BarcodeConverter.exe");
    return File(path, "application/x-zip-compressed");
}

public ActionResult FilePathDownload2()
{
    var path = Server.MapPath("~/Files/BarcodeConverter.exe");
  return File("g:\\BarcodeConverter.exe", "application/x-zip-compressed", "BarcodeConverter.exe");
} 

public ActionResult FilePathDownload3()
{
    var path = Server.MapPath("~/Files/BarcodeConverter.exe");
    var name = Path.GetFileName(path);
    return File(path, "application/x-zip-compressed", name);
}
//FilePathDownload3  下载后的文件名还是默认为了 Action 的名字。原因是 fileDownloadName 将作为 URL 的一部分,只能包含 ASCII 码。所以,我们需要对name进行encode Url.Encode
public ActionResult FilePathDownload4()
{
     var path = Server.MapPath("~/Files/BarcodeConverter.exe");
     var name = Path.GetFileName(path);
     return File(path, "application/x-zip-compressed",Url.Encode(name));
 }

FileContentResult

FileContentResult 可以直接将 byte[] 以文件形式发送至浏览器(而不用创建临时文件)

public FileResult Download()
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\folder\myfile.txt");
    string fileName = "myfile.txt";
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}

FileStreamResult

想给 FileStreamResult 找一个恰当的例子是不太容易的,毕竟 Http Response 中已经包含了一个OutputStream属性,

如果要动态生成文件的话,可以直接向这个输出流中写入数据,效率还高。

当然,我们不会在 Controller 中直接向 Response 的 OutputStream 写入数据,这样做是不符合MVC的,我们应该把这个操作封装成一个 ActionResult。

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

(1)解压(或解密)

public ActionResult FileStreamDownload1()
{
    var path = Server.MapPath("~/Files/myfile.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 格式的。
}

(2)转发(或盗链)

将其它网站上的文件作为本站文件下载(其实就是盗链):
public ActionResult FileStreamDownload1()
{
    var stream = new WebClient().OpenRead("http://files.cnblogs.com/level/test.rar");
    return File(stream, "application/x-zip-compressed", "test.rar");
}

参考文献:ASP.NET MVC:通过 FileResult 向 浏览器 发送文件

时间: 2024-10-05 23:54:16

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

Asp.Net MVC 使用FileResult导出Excel数据文件

用的是Html拼接成Table表格的方式,返回 FileResult 输出一个二进制的文件. 第一种:使用FileContentResult // // 摘要: // 通过使用文件内容,内容类型,文件名称创建一个FileContentResult对象// // 参数: // fileContents: // 响应的二进制文件内容 // // contentType: // 内容类型(MIME类型) // // fileDownloadName: // 显示在浏览器下载窗口的文件名称// // 返

asp.net mvc ajax.beginform()无法上传文件

Asp.Net Mvc使用Ajax.BeginForm上传文件Request.Files始终为null. 使用jquery.form.js插件能解决问题.asp.net mvc ajax.beginform()无法上传文件

MVC 使用FileResult导出Excel数据文件

FileResult 是一个抽象类,继承自 ActionResult.我们可以使用它的子类向客户端发送文件. 最近项目中需要对某个表格导出位Excel为表格,正好使用了到它,将列表数据构造为html的Table即可. chrom下没问题,其他浏览器兼容性还未测试,先记录下来.在controler中定义如下: public FileResult HtmlTOExcel(List<Survery> surveryList) { var sbHtml = new StringBuilder(); H

在 asp.net mvc 中,如何对带文件扩展名的url进行路由处理

默认情况下,静态文件似乎不会走 asp.net mvc 的路由,直接会由 iis 返回静态文件,或 404 错误. 这时,需要在 web.config 中配置具体哪些文件需要经过路由处理(在 system.webServer/handlers 下): <add name="XmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferReques

ASP.NET MVC 项目直接预览PDF文件

背景及需求 项目使用的是MVC4框架,其中有一个功能是根据设置生成PDF文件,并在点击时直接预览. 实现过程 1.第一版实现代码: HTML内容 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> &

ASP.Net MVC——DotNetZip简单使用,解决文件压缩问题。

准备工作: 在vs工具栏中找到NuGet 下载DotNetZip 现在就可以使用DotNetZip强大的类库了,在这里我给出一些简单的使用. public ActionResult Export() { using (ZipFile zip = new ZipFile(System.Text.Encoding.Default)) { zip.AddFile(Server.MapPath("~/Img/2.png"), "Images"); zip.AddFile(S

ASP.NET MVC铵钮Click后下载文件

本篇Insus.NET练习的是FilePathResult和FileStreamResult操作.本篇也算是<如何把Json格式字符写进text文件中>http://www.cnblogs.com/insus/p/4306640.html续篇.为视图返回文件,前者是已经知道文件路径,后者是根据文件流进行返回.在网上看到下载文件一般都是使用a标签,很少使用Button进行.本篇想使用Button来进行,多一种方式呈现. 比如某一目录下有些文件,让用户下载.我就可以使用上面的操作进行.在控制器创建

Asp.net MVC利用WebUploader上传大文件出现404解决办法。

刚开始我上传小文件都是比较顺利的,但是上传了一个大文件大约有200M的压缩包就不行了.在chrome里面监视发现网络状态是404,我分析可能不是WebUploader的限制,应该是WebConfig限制了文件的大小. 不废话: 这是兼容老版本的配置 <system.web> <!--maxRequestLength就是文件的最大字符数,最大值不能超过2个G左右,executionTimeout是超时时间--> <httpRuntime targetFramework=&quo

7 天玩转 ASP.NET MVC — 第 1 天

0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET MVC 开发者,这很酷吧! 7 天玩儿 转 ASP.NET MVC — 第 1 天 第一天是热身运动,这篇我们将围绕 Controller 和 Views 实践两个 Labs.在每个 Lab 之中都伴随着一些 Question 和 Answer.所以文章的主体框架是 Lab 和 Q&A. 7 天玩儿