当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃。可以参考如下代码来避免这个问题。

  1. using System;

  2. namespace WebApplication1

  3. {

  4. public partial class DownloadFile : System.Web.UI.Page

  5. {

  6. protected void Page_Load(object sender, EventArgs e)

  7. {

  8. System.IO.Stream iStream = null;

  9. // Buffer to read 10K bytes in chunk:

  10. byte[] buffer = new Byte[10000];

  11. // Length of the file:

  12. int length;

  13. // Total bytes to read.

  14. long dataToRead;

  15. // Identify the file to download including its path.

  16. string filepath = Server.MapPath("/") +"./Files/TextFile1.txt";

  17. // Identify the file name.

  18. string filename = System.IO.Path.GetFileName(filepath);

  19. try

  20. {

  21. // Open the file.

  22. iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,

  23. System.IO.FileAccess.Read, System.IO.FileShare.Read);

  24. // Total bytes to read.

  25. dataToRead = iStream.Length;

  26. Response.Clear();

  27. Response.ClearHeaders();

  28. Response.ClearContent();

  29. Response.ContentType = "text/plain"; // Set the file type

  30. Response.AddHeader("Content-Length", dataToRead.ToString());

  31. Response.AddHeader("Content-Disposition", "p_w_upload; filename=" + filename);

  32. // Read the bytes.

  33. while (dataToRead > 0)

  34. {

  35. // Verify that the client is connected.

  36. if (Response.IsClientConnected)

  37. {

  38. // Read the data in buffer.

  39. length = iStream.Read(buffer, 0, 10000);

  40. // Write the data to the current output stream.

  41. Response.OutputStream.Write(buffer, 0, length);

  42. // Flush the data to the HTML output.

  43. Response.Flush();

  44. buffer = new Byte[10000];

  45. dataToRead = dataToRead - length;

  46. }

  47. else

  48. {

  49. // Prevent infinite loop if user disconnects

  50. dataToRead = -1;

  51. }

  52. }

  53. }

  54. catch (Exception ex)

  55. {

  56. // Trap the error, if any.

  57. Response.Write("Error : " + ex.Message);

  58. }

  59. finally

  60. {

  61. if (iStream != null)

  62. {

  63. //Close the file.

  64. iStream.Close();

  65. }

  66. Response.End();

  67. }

  68. }

  69. }

  70. }

关于此代码的几点说明:

1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据。

2. 根据下载的文件类型来指定 Response.ContentType 。(参考OSChina的这个网址可以找到大部分文件类型的对照表:http://tool.oschina.net/commons)

3. 在每次写完response时记得调用 Response.Flush()

4. 在循环下载的过程中使用 Response.IsClientConnected 这个判断可以帮助程序尽早发现连接是否正常。若不正常,可以及早的放弃下载,以释放所占用的服务器资源。

5. 在下载结束后,需要调用 Response.End() 来保证当前线程可以在最后被终止掉。

原文链接:http://www.codeceo.com/article/asp-net-big-file.html

转载于:https://blog.51cto.com/6685336/1720023

ASP.NET 大文件下载的实现思路及代码相关推荐

  1. 大整数加法基本思路和代码(C++实现)

    大整数加法基本思路和代码(C++实现) 前言 分析 编程 前言 如果给出两个很大很大的整数,这两个数大到long类型也装不下,比如100位整数,如何求它们的和呢? Java中有无敌的BigIntege ...

  2. Asp.net大文件下载

    public partial class _Default : System.Web.UI.Page {     protected void Page_Load(object sender, Eve ...

  3. php百度网盘登录,php登陆状态百度网盘获取文件下载链接【思路|部分代码】

    本帖最后由 芊雨千寻 于 2017-7-2 10:55 编辑 不提供分享后的解析思路,其实很简单的但是访问多了老出验证码很尴尬.....php登陆百度云很麻烦的,但是通过浏览器复制下来百度的登陆状态c ...

  4. php 中 相关文章 的思路,php之购物车类思路及代码

    相信大家肯定都在电商网站买过东西,当我们看中一件喜欢又想买的东西时,这时候你又不想这么快结账,这时候你就可以放入购物车: 就像我们平时去超市买东西一样,会推着购物车去买东西: 那么我们接下来看看jav ...

  5. 在ASP.NET中跟踪和恢复大文件下载

    在Web应用程序中处理大文件下载的问题一直出了名的困难,因此对于大多数站点来说,如果用户的下载被中断了,它们只能说悲哀降临到用户的身上了.但是我们现在不必这样了,因为你可以使自己的ASP.NET应用程 ...

  6. 【多线程编程学习】java多线程基于数据分割的大文件下载器

    文章目录 代码:基于数据分割的大文件下载器 作为包装的存储对象类: 主文件下载类: 子任务下载类: 处理缓存: 启动类: 数据分割思想产生的问题 代码来自书籍<java多线程编程实战指南> ...

  7. c#.Net MVC服务端下载文件、限制下载速度、大文件下载、对性能的影响、对大文件的支持、对断点续传和多线程下载的支持

    一.ASP.NET文件下载各种方式比较:对性能的影响.对大文件的支持.对断点续传和多线程下载的支持 asp.net里提供了多种方式,从服务器端向客户端写文件流,实现客户端下载文件.这种技术在做防下载系 ...

  8. java 下载加速_Java实现大文件下载,提速30倍!想学?我教你啊!

    前言 兄弟们看到这个标题可能会觉得是个标题党,为了解决疑虑,我们先来看下最终的测试结果: 测试云盘下载的文件 46M,自己本地最大下载速度 2M 1. 单线程下载,总耗时: 603s img 2. 多 ...

  9. ASP.NET系统分析与设计思路探讨 (原创)

    ASP.NET系统分析与设计思路探讨 (以前做的一片文章,是学完3层结构后写在)          ASP.NET是以浏览器为用户界面的,与WINDOWS方式最大的区别在于无法保持状态.假如用户必须完 ...

最新文章

  1. java的队列_java实现队列
  2. jupyter跑Java,C++/C,R
  3. c java python html_如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处
  4. WPF combox二级联动
  5. 外部定义了一个数组,在函数内用指针对其操作
  6. 今日代码(200714)--主客观求指标权重及求城市得分
  7. 工厂设计模式–一种有效的方法
  8. Vue.directive自定义指令
  9. 如何使用阿里云ARMS轻松重现用户浏览器问题
  10. 临颖一高2021高考成绩查询,临颍一高举办2021年决战高考百日冲刺誓师大会
  11. netty9---使用编码解码器
  12. mysql 临时表 中文_MySQL 临时表
  13. Spring boot 2.0 with Oauth2 + Jwt
  14. vue之elementui表单验证最基本实例
  15. 调用登录接口返回“参数错误”
  16. android谷歌地图_Android Google地图:添加天气数据
  17. 关于巨杉数据库的学习
  18. 同步MySQL跨库且不同shema表数据
  19. 莫名其妙出现各种syntax error的解决方案
  20. Android 适配Dark Theme(暗黑模式),看完跪了

热门文章

  1. GitHub高效搜索
  2. 读书狂想之《穷爸爸,富爸爸》财富观
  3. (0093)iOS开发自己账号跑真机报错:conflicting provisioning
  4. (0021)iOS 开发之-苹果官方文档
  5. 测试udp端口状态 curl_检测TCP/UDP端口的连通性
  6. Linux虚拟文件系统解析
  7. 软件工程作业No.5
  8. linux 修改图片的尺寸
  9. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
  10. c# webrequest 自动登入网站