上一篇我们说到大文件的分片下载, 断点续传, 秒传, 有的博友就想看分片下载, 我们也来总结一下下载的几种方式, 写的比较片面, 大家见谅 ^_^.
下载方式:
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