DownLoadHelper.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.IO;
  3. using System.Web;
  4. using System.Threading;
  5. namespace Ant.Service.Utilities
  6. {
  7. /// <summary>
  8. /// 文件下载帮助类
  9. /// </summary>
  10. public class DownLoadHelper
  11. {
  12. #region ResponseFile 输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小
  13. /// <summary>
  14. /// 输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小
  15. /// </summary>
  16. /// <param name="_Request">Page.Request对象</param>
  17. /// <param name="_Response">Page.Response对象</param>
  18. /// <param name="_fileName">下载文件名</param>
  19. /// <param name="_fullPath">带文件名下载路径</param>
  20. /// <param name="_speed">每秒允许下载的字节数</param>
  21. /// <returns>返回是否成功</returns>
  22. public static bool ResponseFile(HttpRequest _Request, HttpResponse _Response, string _fileName, string _fullPath, long _speed)
  23. {
  24. try
  25. {
  26. FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  27. BinaryReader br = new BinaryReader(myFile);
  28. try
  29. {
  30. _Response.AddHeader("Accept-Ranges", "bytes");
  31. _Response.Buffer = false;
  32. long fileLength = myFile.Length;
  33. long startBytes = 0;
  34. int pack = 10240; //10K bytes
  35. //int sleep = 200; //每秒5次 即5*10K bytes每秒
  36. int sleep = (int)Math.Floor((double)(1000 * pack / _speed)) + 1;
  37. if (_Request.Headers["Range"] != null)
  38. {
  39. _Response.StatusCode = 206;
  40. string[] range = _Request.Headers["Range"].Split(new char[] { '=', '-' });
  41. startBytes = Convert.ToInt64(range[1]);
  42. }
  43. _Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
  44. if (startBytes != 0)
  45. {
  46. _Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength));
  47. }
  48. _Response.AddHeader("Connection", "Keep-Alive");
  49. _Response.ContentType = "application/octet-stream";
  50. _Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8));
  51. br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
  52. int maxCount = (int)Math.Floor((double)((fileLength - startBytes) / pack)) + 1;
  53. for (int i = 0; i < maxCount; i++)
  54. {
  55. if (_Response.IsClientConnected)
  56. {
  57. _Response.BinaryWrite(br.ReadBytes(pack));
  58. Thread.Sleep(sleep);
  59. }
  60. else
  61. {
  62. i = maxCount;
  63. }
  64. }
  65. }
  66. catch
  67. {
  68. return false;
  69. }
  70. finally
  71. {
  72. br.Close();
  73. myFile.Close();
  74. }
  75. }
  76. catch
  77. {
  78. return false;
  79. }
  80. return true;
  81. }
  82. #endregion
  83. }
  84. }