撑到大三了,结果发现周围的同学更加堕落了,尤其是某些人,表面上看起来很认真,实际上三天打鱼,两天晒网,结果一事无成,却还要抱怨学校教育失败。

为了吸取他们的教训,就算是一个小小的编码问题,我也要努力解决。因为学习的机会一向都在,只是自己有没有去努力而已。

之前做个班级站点的课程设计,用一天半的时间做完虽然各方面不咋样,但麻雀虽小,五脏俱在,功能流程还是挺完整的。

就算是一个小小的课程设计,在这短暂的时间内,也遇到了不少问题,有大有小。

先说文件下载这块。

文件下载一般都是需要一个文件选择对话框来选择存放文件的地方。我们可以自己做一个,但简单的方面就是利用浏览器的现成功能。

所有的浏览器都包括文件下载功能,但文件选择对话框却不是每个浏览器都有提供。这里我只选择我常用的两个浏览器:谷歌浏览器和搜狗浏览器。

先来一个小例子:

public ActionResult Index()
{var path = Server.MapPath("~/frog.jpg.jpg");return File(path, "iamge/jpeg");
}

这里是下载工程根目录下的frog.jpg.jpg。
     代码非常简短,只有两行,但效果却不差:

这是搜狗浏览器上的效果,如果是谷歌浏览器,则是直接下载下来,但是文件并不是我们的文件名,甚至格式也不一样,就是一个奇怪的名为"下载"的文件。

首先是解释上面两行代码的原理:

Server.MapPath()的参数是一个虚拟路径的,它的原理是根据提供的虚拟路径返回一个虚拟路径对应的物理路径,而且参数路径必须是虚拟路径。我们服务器上传的文件都是放在服务器的一个路径下,这个路径是物理路径,但是打开文件的URL却是虚拟路径,这样的好处就像是相对路径和绝对路径的对比,想想如果我们将文件的额存放地点放在另一个地方,如果URL为物理路径,那么就会找不到该文件。

path现在是frog.jpg.jpg的物理路径,然后我们要将该文件发送给浏览器,则需要利用FilePathResult的File(),指定发送文件的物理路径和格式就可以了。

值得注意的是,如果是在搜狗中,指定格式是application/x-zip-compressed(zip的MIME格式)或者application/octet-stream(rar的MIME格式),在网页上看到的将会是乱码,但如果是谷歌,依然是上面那样的情况,但是用压缩文件软件打开,就会发现里面就是我们要的文件,它确实是被下载下来了。

由于谷歌浏览器的行为与我们想要的效果差了太远了,所以下面就不再讨论谷歌浏览器的行为。

我用word文档,Excel表格和txt文档格式的文件分别发送给浏览器,结果只有txt文档的文件中的内容能够正常显示在网页中,其他都是乱码,可见,网页能够直接打开的文件格式是有限的,至少需要第三方软件打开的文件是无法打开的。

上面这些都不是重点,只是我的一点好奇心而已。现在我们进入重点,就是让浏览器提供下载对话框。

要实现这样的功能,上面的代码是不行的,至少我这边是不行的,要用下面的代码:

var path = Server.MapPath("~/1.txt");
var name = Path.GetFileName(path);
return File(path, "application/zip-x-compressed", name);

然后浏览器的运行效果如:

这就是我们想要的结果。

我们增加了一行代码,就是使用Path.GetFileName()来获取指定物理路径的文件的文件名和扩展名,然后再在File()中增加一个新的参数,该参数就是我们要下载的文件的文件名和扩展名。

但可怕的是,上面代码中File的格式可以随便指定,甚至可以直接为"1"(只要不是null以及""),都会提供上面的下载对话框!!这告诉我们,该下载对话框需要的并不是文件的正确格式,它需要的仅仅只是需要下载的文件的文件名(这个文件名并一定要是正确的文件名,我们可以指定新的名字,反正它就只要将该物理路径下的那个文件下载下来就行)以及该文件的物理路径。

   必须注意的是,如果文件名包含有中文,那么它就会显示这样的效果:

如果想要显示正确的中文文件名,我们可以这样做:

return File(path, "1", Url.Encode(name));

效果就会这样:

   要实现上面的效果,我们还可以这样做:
byte[] data = Encoding.UTF8.GetBytes("~/中国.txt");
return File(data, "1", Url.Encode("中国.txt"));

这里我们是直接将"~/中国.txt"变为byte[]数组然后发给浏览器,保存在中国.txt中,打开就是"~/中国.txt"。这种方式属于FileContentResult。

大概的内容就是上面这样,当然我们可以自定义,毕竟像是谷歌浏览器根本就不提供下载对话框的情况下,更加需要我们自定义下载对话框,但这里不讲,先是这样,以后再继续补充。

ASP.NET MVC 向浏览器发送文件以提供文件下载功能相关推荐

  1. 使用mvc模式读取服务器上的文件,ASP.NET MVC之读取服务器文件资源的两种方式

    初次认识asp.net mvc时,以为所有文件都需要走一遍路由,然后才能在客户端显示, 所以我首先介绍这一种方式 比如说:我们在服务器上有图片: ~/resource/image/5.jpg 我们就需 ...

  2. ASP.NET MVC实现简单的文件上传与下载

    使用ASP.NET MVC实现简单的文件上传与下载. 1.上传文件HTML <form action='@Url.Action("Upload", "File&qu ...

  3. [转载]ASP.NET MVC:通过 FileResult 向 浏览器 发送文件

    在 Controller 中我们可以使用 FileResult 向客户端发送文件. FileResult FileResult 是一个抽象类,继承自 ActionResult.在 System.Web ...

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

    在 Controller 中我们可以使用 FileResult 向客户端发送文件. FileResult FileResult 是一个抽象类,继承自 ActionResult.在 System.Web ...

  5. 一起谈.NET技术,ASP.NET MVC 通过 FileResult 向浏览器发送文件

    在 Controller 中我们可以使用 FileResult 向客户端发送文件. FileResult FileResult 是一个抽象类,继承自 ActionResult.在 System.Web ...

  6. ASP.NET MVC自定义ActionResult实现文件压缩

    有时候需要将单个或多个文件进行压缩打包后在进行下载,这里我自定义了一个ActionResult,方便进行文件下载 using System; using System.Collections; usi ...

  7. 关于jQuery在Asp.Net Mvc 框架下Ajax文件上传的实现

    1. 实现传统的网络文件上传解决方案 首先,我先实现一个传统的网络文件上传方案,建立一个web页面,我还需要一个<form>和两个<input>元素就能解决问题,如在Index ...

  8. ASP.NET MVC 4应用程序文件夹

    App_Start It has configuration classes to reduce clutter code in the Global.asax 它包含了配置类来减少在Global.a ...

  9. asp.net mvc + javascript生成下载文件

    近期做的是对现有项目进行重构.WEB FROM改成MVC,其实也算是推倒重来了. 里面有一个导出功能,将数据输出成txt文件,供下载.原先的做法是有一个隐藏的iframe,在这个iframe的页面中设 ...

最新文章

  1. BZOJ4681 [jsoi2010]旅行
  2. 巧用1个GPIO控制2个LED显示4种状态
  3. JavaScript 逆向 ( 一 ) --- JavaScript 语法基础
  4. mysql 表与表之间的条件比对_《MySQL数据库》关联查询
  5. php公共控制器,Thinkphp 3.2.3 公共控制器的使用
  6. 问题二十七:ray traing中的positionable camera
  7. 小程序webview应用实践
  8. STM32F10xxx启动模式分析 – 梦想照旧
  9. Facebook开源的数据Mock:Memisis详解
  10. 从天宇核心团队出走看山寨“春秋”
  11. 聊聊 HTAP 的前世今生
  12. surface pro3 禁用触屏方法
  13. “电脑下乡”必须坚持创新之路
  14. 能把中文论文翻译成英文进行查重吗?
  15. 数学难题html5小游戏答案,数学难题大全及答案
  16. MT4开发文档之 Server API: Hooks and Trade Functions
  17. 加密保护软件 WinLicense常见问题整理大全(三)
  18. Python爬取小说(3)整本爬取
  19. 实习生必学git以及详细下载安装步骤
  20. word中公式和编号对不齐怎么办?

热门文章

  1. Linux DMA 驱动学习总结
  2. 通过iframe标签绕过csp
  3. Python闭包与延迟绑定
  4. Discuz X3.1 论坛修改的方法(门户的修改)
  5. wpf Visibility 动画
  6. Python 2.7 Exception格式化工具
  7. GetHashCode() 的研究
  8. 某公司的一道机考题的解答
  9. 收敛标准对卷积核数量最优值的影响
  10. 机器学习网站收集(to be continued)