欢迎使用CSDN-markdown编辑器

来源:互联网 发布:知乎lookfantastic 编辑:程序博客网 时间:2024/06/08 12:51

C# - 文件下载

  • 文件分块下载
    • 原理
      每次只读取一部分文件流,如100k到缓冲区,使用flush()将缓冲区的内容刷新到文件中。
    • 代码
public void Download(filePath){    filePath=Server.MapPath(filePath);; //要下载的文件路径    string fileName = "downloadfile.txt";//客户端将要保存的文件名                      const long Size = 102400;//缓冲区大小100K ,每次读取文件,只读取100K,缓解服务器的压力      byte[] buffer = new byte[Size];      FileStream stream = null;     try{        stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);//打开文件        Response.Clear();        long fileSize= stream.Length ;//获取下载的文件总大小          Response.ContentType = "application/octet-stream";        Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));        while (fileSize> 0 && Response.IsClientConnected)        {             int lengthRead=stream.Read(buffer,0,Convert.ToInt32(Size));//读取的大小              Response.OutputStream.Write(buffer, 0, lengthRead);            Response.Flush();            fileSize= fileSize- lengthRead;        }    }    catch(Exception ex){        Response.Write("下载失败:" + ex.Message);    }    finally{        if (stream != null)        {            stream.Close();        }        Response.Close();    }}
  • 从ftp文件服务器上分块下载文件
    • 原理
      先从ftp服务器上读取部分文件流到缓冲区,然后再使用flush()函数将缓冲区的文件刷新到文件中。
    • 代码
      FTPHelper中的下载方法
/// <summary>/// 文件下载/// </summary>/// <param name="buffer">缓冲区</param>/// <param name="Size">读取文件大小</param>/// <param name="URIpath">ftp文件路径</param>/// <returns></returns>public int DownLoadFile(byte[] buffer, long Size, string URIpath){     FtpWebRequest ftp;    int lengthRead = 0;    try    {        ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(URIpath));        ftp.Method = WebRequestMethods.Ftp.DownloadFile;        ftp.UseBinary = true;        ftp.Credentials = new NetworkCredential(ConfigureHelper.getConfigKey("ftpUserName"), ConfigureHelper.getConfigKey("ftpPassword"));        FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();        Stream ftpStream = response.GetResponseStream();        lengthRead = ftpStream.Read(buffer, 0, Convert.ToInt32(Size));        ftpStream.Close();        response.Close();    }    catch (Exception e)    {    }    return lengthRead;} 

controller方法

public void Download(filePath){    string fileName = "downloadfile.txt";//客户端将要保存的文件名                      const long Size = 102400;//缓冲区大小100K ,每次读取文件,只读取100K,缓解服务器的压力      byte[] buffer = new byte[Size];       try{         Response.Clear();        long fileSize= getFileSize();//获取下载的文件总大小          Response.ContentType = "application/octet-stream";        Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));        while (fileSize > 0 && Response.IsClientConnected)        {             int lengthRead = FTPClientHelper.ftp.DownLoadFile(buffer, Size , filePath);//读取的大小              Response.OutputStream.Write(buffer, 0, lengthRead);            Response.Flush();            fileSize= fileSize- lengthRead;        }    }    catch(Exception ex){        Response.Write("下载失败:" + ex.Message);    }    finally{        Response.Close();    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高铁喷雾被扣了怎么办 宝宝不好好吸奶怎么办 宝宝不用劲吸奶怎么办 刚出生的宝宝不吃奶怎么办 老婆怀孕想吐怎么办呢 菜把下水道堵了怎么办 一楼厕所堵了怎么办 农村房屋确权有争议怎么办 盲审一个没过怎么办 本科生论文盲审不过怎么办 本科盲审没通过怎么办 一篇论文多次引用著作怎么办 学生毕业后改名学籍怎么办 大学毕业后改名字后学籍怎么办 考科目三下暴雨怎么办 挂科太多拿不到毕业证怎么办 挂科太多不给毕业证怎么办 大专毕业拿不到毕业证怎么办 高考差一分二本怎么办 3个月宝宝大小眼怎么办 华东交大理工学院没有评教怎么办 学校断4g网怎么办 学校移动4g网卡怎么办 没上专科线怎么办福建 联考没过本科线怎么办 拍婚纱拍的脸歪怎么办? 老婆彻底寒心要离婚怎么办 手机被同学偷了怎么办 钱被同学偷了怎么办 上班穿皮鞋脚疼怎么办 高跟靴子买大了怎么办 我怀了第三个小孩怎么办? 离婚前把钱花了怎么办 对谈对象有压力怎么办 和对象感情淡了怎么办 孩子处对象学习下降怎么办 孩子高三成绩差怎么办 老妈怨气太重怎么办 广东小高考有d怎么办 高考考生档案袋有个小洞怎么办 江苏省考生出省后小高考成绩怎么办