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


下载方式:

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 = ;//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 > && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, , Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, , lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
return true;
}
else
return false;
}

总结:

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

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

C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小的更多相关文章

  1. spring mvc handler的三种方式

    springmvc.xml 三种方式不能针对一个controller同时使用 <?xml version="1.0" encoding="UTF-8"?& ...

  2. 技术流:6大类37种方式教你在国内推广App

    转自:http://www.gamelook.com.cn/2015/01/201906 如何有效的推广自己App,是每个发行商都要考虑的问题,当然每个产品都有适合自己的推广方式.本文就集结了包括应用 ...

  3. (摘录)ASP.NET提供文件下载函数(支持大文件、续传、速度限制、资源占用小)

    // 输出硬盘文件,提供下载 // 输入参数 _Request: Page.Request对象, _Response: Page.Response对象, _fileName: 下载文件名, _full ...

  4. MVC到底使用哪种方式传递Model,在ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple之间取舍

    在"MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple"中,体验了使用不同的方式传递多 ...

  5. mvc model 传值两种方式区别

    1: controller中: public actionresult index() { M m=new M(); return view(m) } view中: @model.phone vs 中 ...

  6. spring mvc 参数传递的三种方式

    springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  7. mvc 重定向的几种方式

    在RouteConfig添加一个简单的路由 //新增路由 routes.MapRoute( name: "Article", url: "Detial/{id}" ...

  8. MVC5控制器传值的三种方式(ViewData,ViewBag,TempData),刚刚学习MVC5的新手,希望各位大神多多指教

    mvc传值的三种方式:1.ViewData 在使用过程中需要类型转换 例子: ViewData["MyTitle"]="ViewData传值"; 引用: @Vi ...

  9. springmvc 异常统一处理的三种方式详解

    1 描述  在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦 ...

随机推荐

  1. CLOSE_WAIT问题-TCP

    环境简述 要说清楚问题,先要简单说下生产环境的网络拓扑(毕竟是个网络问题对吧) 看,挺简单的对吧,一个OpenResty做SLB承受客户端请求,反响代理到几台应用服务器.由于业务要求,必须要同步调用第 ...

  2. 在CentOS下安装Git

    1.安装git依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUti ...

  3. linux系统版本查看

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.# uname -a   (Linux查看版本当前操作系统内核信息)   Lin ...

  4. 容器化的Apache服务并监控

    1:基础容器编译部署apache 1.1:pull一个ubuntu 16.04的镜像 sudo docker pull ubuntu:16.04 1.2:运行容器 sudo docker run -d ...

  5. STM32标准库GPIO操作

    STM32标准库GPIO操作 STM32任何外围设备的使用都分为两部分:初始化和使用.体现在代码上就是:(1)有一个初始化函数(2)main函数中的使用 1.初始化GPIO 初始化GPIO函数代码: ...

  6. Windows环境下消息中间件RabbitMq的搭建与应用

    前言 消息中间件目前已经在很多大型的项目上得到了运用,我们常见的有 RabbitMq, activitymq,kafka,rocketmq,其中rocketmq是阿里自己在kafka的基础上用java ...

  7. 响应式WEB设计的基本原则大总结

    响 应式Web设计对于解决多类型屏幕问题来说是个不错方案,但从印刷的角度来看,其却存在着很多的困难.没有固定的页面尺寸.没有毫米或英寸,没有任何物理 限制,让人感到无从下手.随着建立网站可用的各种小工 ...

  8. C# RichTextBox 滚动条 滚动到最新行

    richTextBox.Select(richTextBox.TextLength, 0); richTextBox.ScrollToCaret();

  9. Haskell学习-函数式编程初探

    原文地址:Haskell学习-函数式编程初探   为什么要学习函数式编程?为什么要学习Haskell?   .net到前端,C#和JavaScript对我来说如果谈不上精通,最起码也算是到了非常熟悉的 ...

  10. KnockoutJS知识规整目录

    对于Web开发来讲,前端接触是避免不了的,特别是对于中小公司,没有严格的职位区分,前后端人员互相身兼是常有的事情,使用一些好的框架,能够帮助我们快速开发并完成需要的功能,对于前端的JS框架来讲MVVM ...