android file transfer下载_.NET大文件下载几种方式、支持速度限制、资源占用小

(给DotNet加星标,提升.Net技能)

转自:学习中的苦与乐

cnblogs.com/xiongze520/p/10417472.html

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

下载方式

1、html超链接下载

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

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

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

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

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

  • http         如:百度

  • file          如:图片

  • ftp           如:进入

  • mailto     如:e-mail

2、后台下载

四种方法:

返回filestream、返回file、TransmitTile方法、Response分块下载。

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

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

1、返回filestream

/// 
/// 返回filestream
///
///
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

/// 
/// 返回file
///
///
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方法

/// 
/// TransmitFile方法
///
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分块下载

/// 
/// Response分块下载,输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小
///
/// 客户端保存的文件名
/// 客户端保存的文件路径(包括文件名
///
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分块下载。

推荐阅读

(点击标题可跳转阅读)

.NET基于WebUploader大文件分片上传、断网续传、秒传

一键部署VS插件:让.NET开发者更幸福

.NET Core In Docker内编译发布并运行

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

64d7f328df9cd0a7ef08f1b773c690e6.png

喜欢就点一下「好看」呗~

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页