zoukankan      html  css  js  c++  java
  • C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小

    上一篇我们说到大文件的分片下载、断点续传、秒传,有的博友就想看分片下载,我们也来总结一下下载的几种方式,写的比较片面,大家见谅^_^。


    下载方式:

    1、html超链接下载;

    2、后台下载(四种方法:返回filestream、返回file、TransmitTile方法、Response分块下载)。


    1、html超链接下载

      超级链接在本质上属于一个网页的一部分,它是一种允许我们同其他网页或站点之间进行连接的元素。

    各个网页链接在一起后,才能真正构成一个网站。

      所谓的超链接是指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页,也可以是相同网页

    上的不同位置,还可以是一个图片,一个电子邮件地址,一个文件,甚至是一个应用程序。

      超链接的种类(一般有四种:http,file,ftp,maito):

      1. http          如:<a href="http://www.baidu.com">百度</a>

      2. file           如:<a href="file://images/1.jpg">图片</a>

      3. ftp            如:<a href="ftp://192.168.0.0/">进入</a>

      4. mailto      如:<a href="mailto:qq@163.com">e-mail</a>


    2、后台下载(四种方法:返回filestream、返回file、TransmitTile方法、Response分块下载)

    前台请求后台,后台做出响应进行数据下载。至于请求方式可以多样,比如:a标签跳转,ajax请求等均可。

    我们来看后台响应的四种方式:


    1、返回filestream

        /// <summary>
            /// 返回filestream
            /// </summary>
            /// <returns></returns>
            public FileStreamResult filestream_download()
          {
            string fileName = "wenjian.txt";//客户端保存的文件名
              string filePath = Server.MapPath("/Upload/wenjian.txt");//指定文件所在的全路径
              return File(new FileStream(filePath, FileMode.Open), "text/plain",//"text/plain"是文件MIME类型
            fileName);
          }

    2、返回file

        /// <summary>
            /// 返回file
            /// </summary>
            /// <returns></returns>
            public FileResult file_download()
            {
                string filePath = Server.MapPath("/Upload/wenjian.txt");//路径
                return File(filePath, "text/plain", "wenjian.txt"); //"text/plain"是文件MIME类型,welcome.txt是客户端保存的名字
            }

    3、TransmitFile方法

    /// <summary>
    /// TransmitFile方法
    /// </summary>

    public bool TransmitFile_download()
      {
         string fileName = "wenjian.txt";//客户端保存的文件名
         string filePath = Server.MapPath("/Upload/wenjian.txt");//路径
         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();
       return true; }

    4、Response分块下载

         /// <summary>
            ///  Response分块下载,输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小
            /// </summary>
            /// <param name="fileName">客户端保存的文件名</param>
            /// <param name="filePath">客户端保存的文件路径(包括文件名)</param>
            /// <returns></returns>
            public bool ResponseDownLoad(string fileName, string filePath)
            {
                
               fileName = "wenjian.txt";//客户端保存的文件名
               filePath = Server.MapPath("/Upload/wenjian.txt"); //路径(后续从webconfig读取)
    
               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();
                   return true;
               }
               else
                   return false;
            }

    总结:

    以上就是我所了解的几种下载方式,个人比较中意Response分块下载。

    感谢大家的支持,写的不好望大家见谅。^_^

    欢迎关注订阅我的微信公众平台【熊泽有话说】,更多好玩易学知识等你来取
    作者:熊泽-学习中的苦与乐
    公众号:熊泽有话说
    出处:https://www.cnblogs.com/xiongze520/p/10417472.html
    创作不易,任何人或团体、机构全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。  

     

  • 相关阅读:
    Java+7入门经典 -1 简介
    优化算法动画演示Alec Radford's animations for optimization algorithms
    如何写科技论文How to write a technical paper
    开始学习深度学习和循环神经网络Some starting points for deep learning and RNNs
    用500行Julia代码开始深度学习之旅 Beginning deep learning with 500 lines of Julia
    用10张图来看机器学习Machine learning in 10 pictures
    ICLR 2013 International Conference on Learning Representations深度学习论文papers
    ICLR 2014 International Conference on Learning Representations深度学习论文papers
    卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
    卷积神经网络Convolutional Neural Networks
  • 原文地址:https://www.cnblogs.com/xiongze520/p/10417472.html
Copyright © 2011-2022 走看看