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

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

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

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

先说文件下载这块。

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

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

先来一个小例子:

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

这里是下载工程根目录下的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文档的文件中的内容能够正常显示在网页中,其他都是乱码,可见,网页能够直接打开的文件格式是有限的,至少需要第三方软件打开的文件是无法打开的。

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

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

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

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

这就是我们想要的结果。

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

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

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

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

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

效果就会这样:

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

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

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

ASP.NET MVC 向浏览器发送文件以提供文件下载功能的更多相关文章

  1. ASP.NET MVC之读取服务器文件资源的两种方式

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

  2. ASP.NET MVC 4 RC的JS/CSS打包压缩功能 (转载)

    ASP.NET MVC 4 RC的JS/CSS打包压缩功能 打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载 ...

  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. ASP.NET MVC - 探究应用程序文件夹

    为了学习 ASP.NET MVC,我们将构建一个 Internet 应用程序. 第 2 部分:探究应用程序文件夹. MVC 文件夹 一个典型的 ASP.NET MVC Web 应用程序的文件夹内容如下 ...

  6. 在asp.net mvc中上传大文件

    在asp.net mvc 页面里上传大文件到服务器端,需要如下步骤: 1. 在Control类里添加get 和 post 方法 // get method public ActionResult Up ...

  7. 解决asp.net mvc中*.resx资源文件访问报错

    个人笔记 问题重现 在asp.net mvc中,使用资源文件会出现一个问题,例如: 紧接着我进入视图界面,输入下面代码: <a href="javascript:void(0);&qu ...

  8. Asp.Net Mvc异步上传文件的方式

    今天试了下mvc自带的ajax,发现上传文件时后端action接收不到文件, Request.Files和HttpPostedFileBase都接收不到.....后来搜索了下才知道mvc自带的Ajax ...

  9. ASP.NET MVC 4 RC的JS/CSS打包压缩功能 Scripts.Render和Styles.Render

    打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载多个文件案才能完成网页显示的延迟感,同时通过移除JS/CSS ...

随机推荐

  1. 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点

    转自:http://www.jb51.net/article/100111.htm 首先我们需要安装好Nginx.jdk.Tomcat,安装方法已经在 上一篇 说过了,本篇不再赘述. 下来看一下我们的 ...

  2. mybatis学习资源

    官网:http://mybatis.org/index.html 代码:https://code.google.com/p/mybatisnet/ wiki:http://zh.wikipedia.o ...

  3. 解析Linux操作系统文件目录

    解析Linux操作系统文件目录 随着Linux的不断发展,越来越多的人开始使用Linux,对于那些刚刚接触的人来说,恐怕最先感到困惑的就是那些“不明不白”的目录了.如果想熟练使用Linux,让Linu ...

  4. 如何导入外部Git仓库到中国源代码托管平台(Git@OSC)

    git clone --bare http://git.rcrtm.com/git/dianli.git git clone --mirror https://git.oschina.net/cand ...

  5. 算法笔记_218:花朵数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数.例如:当N=3时,153就满足条件,因为 1^3 + 5^ ...

  6. Percona-XtraBackup系列一:安装 perl(Time::HiRes) is needed by percona-xtrabackup-2.2.10-1.el6.x86_64

    1:在percona官网下载最新的Xtrabackup http://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.10/bi ...

  7. MySQL登陆小问题

    root用户创建用户 CREATE USER gechong IDENTIFIED BY 'gechong'; 登录数据库时提示错误: C:\Users\gechong>mysql -u gec ...

  8. dpkg 小记

    dpkg 安装 dpkg -i to-be-install.deb dpkg 删除 dpkg -r name-of-app dpkg -l 查看有哪些包被安装.其中 ii 标记的包是正常的, rc 标 ...

  9. 路由器mtu值设置

    MTU=最大传输单元 单位:字节 英文:Maximum Transmission Unit”我们平时上网时的各种操作,都是通过一个又一个“数据包”传输来实现的.而MTU指定了网络中可传输数据包的最大尺 ...

  10. Python实现微信刷卡支付(条码支付)MicroPay

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7686765.html 一:资料阅读 场景介绍:https://pay.weixin.qq.com/wiki/d ...