Asp.net MVC下载文件的四种方法以及下载ZIP文件的一种方法

前言:

这几天做了一个从服务器端下载文件的功能,就把自己代码以及和网上的代码进行总结了下。通过服务端进行下载,一般浏览器会自动默认下载的路径,一般的话都会保存到C盘的下载的文件夹里。想要下载到客户端固定的文件夹,这个功能我没考虑,以后有时间看看吧。

不多说了直接上代码:


/// <summary>
        /// 第一种
        /// </summary>
        /// <returns></returns>
        public FileStreamResult Down()
        {
            string fileName = "aaa.xlsx";//客户端保存的文件名
            string filePath = Server.MapPath("~/DownFile/test.xlsx");//路径
            return File(new FileStream(filePath, FileMode.Open), "text/plain",
            fileName);
            //其中:“text/plain”是文件MIME类型

        }
/// <summary>
        /// 第二种
        /// </summary>
        /// <returns></returns>
        public FileResult Down1()
        {
            string filePath = Server.MapPath("~/DownFile/test.xlsx");//路径
            return File(filePath, "text/plain", "welcome.xlsx"); //welcome.txt是客户端保存的名字
        }
 /// <summary>
        /// 第三种
        /// </summary>
        public void Down2()
        {
            string fileName = "aaa.xlsx";//客户端保存的文件名
            string filePath = Server.MapPath("~/DownFile/test.xlsx");//路径
            FileInfo fileinfo = new FileInfo(filePath);
            Response.Clear();         //清除缓冲区流中的所有内容输出
            Response.ClearContent();  //清除缓冲区流中的所有内容输出
            Response.ClearHeaders();  //清除缓冲区流中的所有头
            Response.Buffer = true;   //该值指示是否缓冲输出,并在完成处理整个响应之后将其发送
            Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
            Response.AddHeader("Content-Length", fileinfo.Length.ToString());
            Response.AddHeader("Content-Transfer-Encoding", "binary");
            Response.ContentType = "application/unknow";  //获取或设置输出流的 HTTP MIME 类型
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); //获取或设置输出流的 HTTP 字符集
            Response.TransmitFile(filePath);
            Response.End();
        }
/// <summary>
        /// 第四种
        /// </summary>
        public void Down3()
        {
            string fileName = "aaa.xlsx";//客户端保存的文件名
            string filePath = Server.MapPath("~/DownFile/test.xlsx");//路径
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
            if (fileInfo.Exists == true)
            {
                const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
                byte[] buffer = new byte[ChunkSize];
                
               Response.Clear();
                System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
                long dataLengthToRead = iStream.Length;//获取下载的文件总大小
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
                while (dataLengthToRead > 0 && Response.IsClientConnected)
                {
                    int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
                    Response.OutputStream.Write(buffer, 0, lengthRead);
                    Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                Response.Close();
            }
        }
//下载Zip文件
public void DownLoadZipFile()
        {
            string fileName = Request["fileName"];
            string path = Server.MapPath("/ExportZip/" + fileName + ".zip");
            //指定块大小
            long chunkSize = 204800;
            //建立一个200K的缓冲区
            byte[] buffer = new byte[chunkSize];
            //已读的字节数
            long dataToRead = 0;

            Response.Clear();
            Response.ClearContent();
            Response.ClearHeaders();
            Response.ContentType = "application/octet-stream";
            string encodeFileName = Path.GetFileName(path);
            if (Request.UserAgent.ToLower().IndexOf("msie") > -1)
                encodeFileName = HttpUtility.UrlPathEncode(encodeFileName);
            if (Request.UserAgent.ToLower().IndexOf("firefox") > -1)
                encodeFileName = "\"" + encodeFileName + "\"";
            else
                encodeFileName = HttpUtility.UrlEncode(encodeFileName, System.Text.Encoding.UTF8);
            try
            {
                using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    dataToRead = stream.Length;
                    Response.AddHeader("Content-Disposition", "attachement;filename=" + encodeFileName);
                    Response.AddHeader("Content-Transfer-Encoding", "binary");
                    Response.AddHeader("Content-Length", dataToRead.ToString());
                    while (dataToRead > 0)
                    {
                        if (Response.IsClientConnected)
                        {
                            int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
                            Response.OutputStream.Write(buffer, 0, length);
                            Response.Flush();
                            buffer = new Byte[chunkSize];
                            dataToRead = dataToRead - length;
                        }
                        else
                            dataToRead = -1;
                    }
                }
            }
            catch (Exception)
            {
                Response.Write("<script>alert('下载失败,请重试')</script>");
            }
            finally
            {
                //context.Response.Close();
            }
        }

结尾:

上面的代码都是经过我的实际测试的,完全可以实现功能,大家放心的使用,只需要根据你们的需求把文件名和文件路径改了就行

ASP.NET MVC 5 框架揭秘》以一个模拟ASP.NET MVC内部运行机制的“迷你版MVC框架”作为开篇,其目的在于将ASP.NET MVC真实架构的“全景”勾勒出来。接下来本书以请求消息在ASP.NET MVC框架内部的流向为主线将相关的知识点串连起来,力求将”黑盒式”的消息处理管道清晰透明地展示在读者面前。相信精读本书的读者一定能够将ASP.NET MVC从接收请求到响应回复的整个流程了然于胸,对包括路由、Controller的激活、Model元数据的解析、Action方法的选择与执行、参数的绑定与验证、过滤器的执行以及View的呈现等相关的机制具有深刻的理解。 本书以实例演示的方式介绍了很多与ASP.NET MVC相关的很好实践,同时还提供了一系列实用性的扩展,相信它们一定能够解决你在真实开发过程中遇到的很多问题。本书末章提供的案例不仅仅用于演示实践中的ASP.NET MVC,很多的架构设计方面的东西也包含其中。除此之外,本书在很多章节还从设计的角度对ASP.NET MVC的架构进行了深入分析,所以从某种意义上讲本书可以当成一本架构设计的书来读。 ASP.NET MVC 5 框架揭秘 目录 第1章 ASP.NET + MVC 第2章 路由 第3章 Controller的激活 第4章 Model元数据的解析 第5章 3个描述对象 第6章 Model的绑定(上篇) 第7章 Model的绑定(下篇) 第8章 Model的验证(上篇) 第9章 Model的验证(下篇) 第10章 Action方法的执行 第11章 View的呈现 第12章 过滤器 第13章 特性路由 第14章 案例实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值