经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
ASP.netMVC文件下载的几种方法
来源:cnblogs  作者:dcrenl  时间:2018/10/12 9:49:49  对本文有异议

第一种:最简单的超链接方法,标签的href直接指向目标文件地址,这样容易暴露地址造成盗链,这里就不说了

第二种:后台下载

 

在后台下载中又可以细分为几种下载方式

首先,在前台,我们需要一个标签

Home为controller,download为action。

如果需要传一些参数,可以:

 

在后台:

(1)返回filestream

复制代码
  1. public FileStreamResult download()
  2. {
  3. string fileName = "aaa.txt";//客户端保存的文件名
  4. string filePath = Server.MapPath("~/Document/123.txt");//路径
  5. return File(new FileStream(filePath, FileMode.Open), "text/plain",
  6. fileName);
  7. }
复制代码

其中:“text/plain”是文件MIME类型

 

(2)返回file

  1. public FileResult download()
  2. {
  3. string filePath = Server.MapPath("~/Document/123.txt");//路径
  4. return File(filePath, "text/plain", "welcome.txt"); //welcome.txt是客户端保存的名字
  5. }

 

(3)TransmitFile方法

复制代码
  1. 1 public void download()
  2. 2 {
  3. 3 string fileName = "aaa.txt";//客户端保存的文件名
  4. 4 string filePath = Server.MapPath("~/Document/123.txt");//路径
  5. 5 FileInfo fileinfo = new FileInfo(filePath);
  6. 6 Response.Clear(); //清除缓冲区流中的所有内容输出
  7. 7 Response.ClearContent(); //清除缓冲区流中的所有内容输出
  8. 8 Response.ClearHeaders(); //清除缓冲区流中的所有头
  9. 9 Response.Buffer = true; //该值指示是否缓冲输出,并在完成处理整个响应之后将其发送
  10. 10 Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
  11. 11 Response.AddHeader("Content-Length",fileinfo.Length.ToString());
  12. 12 Response.AddHeader("Content-Transfer-Encoding", "binary");
  13. 13 Response.ContentType = "application/unknow"; //获取或设置输出流的 HTTP MIME 类型
  14. 14 Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); //获取或设置输出流的 HTTP 字符集
  15. 15 Response.TransmitFile(filePath);
  16. 16 Response.End();
  17. 17 }
复制代码

 

(4)Response分块下载

复制代码
  1. 1 public void download()
  2. 2 {
  3. 3 string fileName = "aaa.txt";//客户端保存的文件名
  4. 4 string filePath = Server.MapPath("~/Document/123.txt");//路径
  5. 5
  6. 6 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
  7. 7 if (fileInfo.Exists == true)
  8. 8 {
  9. 9 const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
  10. 10 byte[] buffer = new byte[ChunkSize];
  11. 11
  12. 12 Response.Clear();
  13. 13 System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
  14. 14 long dataLengthToRead = iStream.Length;//获取下载的文件总大小
  15. 15 Response.ContentType = "application/octet-stream";
  16. 16 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
  17. 17 while (dataLengthToRead > 0 && Response.IsClientConnected)
  18. 18 {
  19. 19 int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
  20. 20 Response.OutputStream.Write(buffer, 0, lengthRead);
  21. 21 Response.Flush();
  22. 22 dataLengthToRead = dataLengthToRead - lengthRead;
  23. 23 }
  24. 24 Response.Close();
  25. 25 }
  26. 26 }
复制代码

 

+ajax方法

要重点说说这个方法,ajax返回不了文件流,所以说用ajax调用上面任意一种后台方法都要出问题,下载不了文件。

所以,只能让后台返回所需下载文件的url地址,然后调用windows.location.href。

 

优点:ajax可以传好几个参数(当然以json形式),传100个都无所谓。你要是用的方法传100得写死。。。(公司需求,至少要传100多个参数)

缺点:支持下载exe,rar,msi等类型文件。对于txt则会直接打开,慎用!对于其他不常用的类型文件则直接报错。

        所以我的建议是得到多个参数,通过数据库找到所有需要下载的文件然后压缩打包,然后返回url下载。(你要是一个一个给用户下,用户都疯了)

        那么问题又来了,C#怎么用代码实现将本地的一些文件打包压缩到服务器目录下呢?这我不知道。

           因为你只是单纯的放在目录文件夹下没有用的,我们平时在服务器某目录下添加某一个文件都是右键,添加XXX项这样,这样才能真正的将文件放在服务器中。

           可是纯代码该怎么实现呢??

        * 可能的解决方法:先在项目目录下放一个空的rar文件或者没什么功能的exe,msi文件,然后在后台打包完一些文件后去替换它,不知道可行不。

            (1)首先清空原压缩包中的内容

            (2)将文件压缩到压缩包中

            (3)返回 XXX.rar

 

前端:

  1. "button" id="downloaon"/>

ajax:

复制代码
  1. $("#downloaon").click(function () {
  2. $.ajax({
  3. type: "GET",
  4. url: "/Home/download",
  5. data: { id: "1" },
  6. dataType:"json",
  7. success: function (result) {
  8. window.location.target = "_blank";
  9. window.location.href = result;
  10. }
  11. })
  12. })
复制代码

后台:

  1. public string download(int id)
  2. {
  3. string filePath = "Document/123.msi";//路径
  4. return filePath;
  5. }

这里,id是没有什么作用的,后台就别用什么server.Mappath了,肯定错。直接写服务器项目文件夹/文件名 即可。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号