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();
            }
        }

结尾:

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

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值