怎样恢复能在asp.net中使用c#下载文件 – >最好的方法(对于大文件也是如此)

前端之家收集整理的这篇文章主要介绍了怎样恢复能在asp.net中使用c#下载文件 – >最好的方法(对于大文件也是如此)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
看下面的处理程序:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace FileExplorer
  7. {
  8. /// <summary>
  9. /// Summary description for HandlerForMyFE
  10. /// </summary>
  11. public class HandlerForMyFE : IHttpHandler,System.Web.SessionState.IRequiresSessionState
  12. {
  13.  
  14. private HttpContext _context;
  15. private HttpContext Context
  16. {
  17. get
  18. {
  19. return _context;
  20. }
  21. set
  22. {
  23. _context = value;
  24. }
  25. }
  26.  
  27. public void ProcessRequest(HttpContext context)
  28. {
  29. Context = context;
  30. string filePath = context.Request.QueryString["Downloadpath"];
  31. filePath = context.Server.MapPath(filePath);
  32.  
  33. if (filePath == null)
  34. {
  35. return;
  36. }
  37.  
  38. System.IO.StreamReader streamReader = new System.IO.StreamReader(filePath);
  39. System.IO.BinaryReader br = new System.IO.BinaryReader(streamReader.BaseStream);
  40.  
  41. byte[] bytes = new byte[streamReader.BaseStream.Length];
  42.  
  43. br.Read(bytes,(int)streamReader.BaseStream.Length);
  44.  
  45. if (bytes == null)
  46. {
  47. return;
  48. }
  49.  
  50. streamReader.Close();
  51. br.Close();
  52. string fileName = System.IO.Path.GetFileName(filePath);
  53. string MimeType = GetMimeType(fileName);
  54. string extension = System.IO.Path.GetExtension(filePath);
  55. char[] extension_ar = extension.tocharArray();
  56. string extension_Without_dot = string.Empty;
  57. for (int i = 1; i < extension_ar.Length; i++)
  58. {
  59. extension_Without_dot += extension_ar[i];
  60. }
  61.  
  62. //if (extension == ".jpg")
  63. //{ // Handle *.jpg and
  64. // WriteFile(bytes,fileName,"image/jpeg jpeg jpg jpe",context.Response);
  65. //}
  66. //else if (extension == ".gif")
  67. //{// Handle *.gif
  68. // WriteFile(bytes,"image/gif gif",context.Response);
  69. //}
  70.  
  71. if (HttpContext.Current.Session["User_ID"] != null)
  72. {
  73. WriteFile(bytes,MimeType + " " + extension_Without_dot,context.Response);
  74. }
  75. }
  76.  
  77. private void WriteFile(byte[] content,string fileName,string contentType,HttpResponse response)
  78. {
  79. response.Buffer = true;
  80. response.Clear();
  81. response.ContentType = contentType;
  82.  
  83. response.AddHeader("content-disposition","attachment; filename=" + fileName);
  84.  
  85. response.BinaryWrite(content);
  86. response.Flush();
  87. response.End();
  88. }
  89.  
  90. private string GetMimeType(string fileName)
  91. {
  92. string mimeType = "application/unknown";
  93. string ext = System.IO.Path.GetExtension(fileName).ToLower();
  94. Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
  95. if (regKey != null && regKey.GetValue("Content Type") != null)
  96. mimeType = regKey.GetValue("Content Type").ToString();
  97. return mimeType;
  98. }
  99.  
  100. public bool IsReusable
  101. {
  102. get
  103. {
  104. return false;
  105. }
  106. }
  107. }
  108. }

我使用这个处理程序下载我的文件而不直接在浏览器中打开它们 – > (使用查询字符串路径)

如何让我的文件恢复?

我在互联网下载管理器中没有这个选项!

解决方法

根据要求,这是答案的“清理”版本:
  1. public static bool DownloadFileMethod(HttpContext httpContext,string filePath,long speed)
  2. {
  3. // Many changes: mostly declare variables near use
  4. // Extracted duplicate references to HttpContext.Response and .Request
  5. // also duplicate reference to .HttpMethod
  6.  
  7. // Removed try/catch blocks which hid any problems
  8. var response = httpContext.Response;
  9. var request = httpContext.Request;
  10. var method = request.HttpMethod.ToUpper();
  11. if (method != "GET" &&
  12. method != "HEAD")
  13. {
  14. response.StatusCode = 501;
  15. return false;
  16. }
  17.  
  18. if (!File.Exists(filePath))
  19. {
  20. response.StatusCode = 404;
  21. return false;
  22. }
  23.  
  24. // Stream implements IDisposable so should be in a using block
  25. using (var myFile = new FileStream(filePath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
  26. {
  27. var fileLength = myFile.Length;
  28. if (fileLength > Int32.MaxValue)
  29. {
  30. response.StatusCode = 413;
  31. return false;
  32. }
  33.  
  34. var lastUpdateTiemStr = File.GetLastWriteTimeUtc(filePath).ToString("r");
  35. var fileName = Path.GetFileName(filePath);
  36. var fileNameUrlEncoded = HttpUtility.UrlEncode(fileName,Encoding.UTF8);
  37. var eTag = fileNameUrlEncoded + lastUpdateTiemStr;
  38.  
  39. var ifRange = request.Headers["If-Range"];
  40. if (ifRange != null && ifRange.Replace("\"","") != eTag)
  41. {
  42. response.StatusCode = 412;
  43. return false;
  44. }
  45.  
  46. long startBytes = 0;
  47.  
  48. // Just guessing,but I bet you want startBytes calculated before
  49. // using to calculate content-length
  50. var rangeHeader = request.Headers["Range"];
  51. if (rangeHeader != null)
  52. {
  53. response.StatusCode = 206;
  54. var range = rangeHeader.Split(new[] {'=','-'});
  55. startBytes = Convert.ToInt64(range[1]);
  56. if (startBytes < 0 || startBytes >= fileLength)
  57. {
  58. // TODO: Find correct status code
  59. response.StatusCode = (int) HttpStatusCode.BadRequest;
  60. response.StatusDescription =
  61. string.Format("Invalid start of range: {0}",startBytes);
  62. return false;
  63. }
  64. }
  65.  
  66. response.Clear();
  67. response.Buffer = false;
  68. response.AddHeader("Content-MD5",GetMD5Hash(filePath));
  69. response.AddHeader("Accept-Ranges","bytes");
  70. response.AppendHeader("ETag",string.Format("\"{0}\"",eTag));
  71. response.AppendHeader("Last-Modified",lastUpdateTiemStr);
  72. response.ContentType = "application/octet-stream";
  73. response.AddHeader("Content-Disposition","attachment;filename=" +
  74. fileNameUrlEncoded.Replace("+","%20"));
  75. var remaining = fileLength - startBytes;
  76. response.AddHeader("Content-Length",remaining.ToString());
  77. response.AddHeader("Connection","Keep-Alive");
  78. response.ContentEncoding = Encoding.UTF8;
  79.  
  80. if (startBytes > 0)
  81. {
  82. response.AddHeader("Content-Range",string.Format(" bytes {0}-{1}/{2}",startBytes,fileLength - 1,fileLength));
  83. }
  84.  
  85. // BinaryReader implements IDisposable so should be in a using block
  86. using (var br = new BinaryReader(myFile))
  87. {
  88. br.BaseStream.Seek(startBytes,SeekOrigin.Begin);
  89.  
  90. const int packSize = 1024*10; //read in block,every block 10K bytes
  91. var maxCount = (int) Math.Ceiling((remaining + 0.0)/packSize); //download in block
  92. for (var i = 0; i < maxCount && response.IsClientConnected; i++)
  93. {
  94. response.BinaryWrite(br.ReadBytes(packSize));
  95. response.Flush();
  96.  
  97. // HACK: Unexplained sleep
  98. var sleep = (int) Math.Ceiling(1000.0*packSize/speed); //the number of millisecond
  99. if (sleep > 1) Thread.Sleep(sleep);
  100. }
  101. }
  102. }
  103. return true;
  104. }

猜你在找的asp.Net相关文章