ResumeRequest.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Masuit.Tools.Mvc.Internal;
  2. using System.Web;
  3. namespace Masuit.Tools.Mvc.ActionResults
  4. {
  5. public class ResumeRequest
  6. {
  7. public string FileName { get; set; }
  8. public string ContentType { get; set; }
  9. public ByteRange[] Ranges { get; set; }
  10. public bool IsRangeRequest => (Ranges != null && Ranges.Length > 0);
  11. public bool IsMultipartRequest => (Ranges != null && Ranges.Length > 1);
  12. public ResumeRequest(HttpContextBase context, long contentLength)
  13. {
  14. HttpRequestBase request = context.Request;
  15. ContentType = request.ContentType;
  16. if (!string.IsNullOrEmpty(request.FilePath))
  17. {
  18. FileName = VirtualPathUtility.GetFileName(request.FilePath);
  19. }
  20. ParseRequestHeaderRanges(context, contentLength);
  21. }
  22. protected virtual void ParseRequestHeaderRanges(HttpContextBase context, long contentSize)
  23. {
  24. var request = context.Request;
  25. string rangeHeader = request.Headers[HttpWorkerRequest.GetKnownRequestHeaderName(HttpWorkerRequest.HeaderRange)];
  26. if (!string.IsNullOrEmpty(rangeHeader))
  27. {
  28. string[] ranges = rangeHeader.Replace("bytes=", string.Empty).Split(",".ToCharArray());
  29. Ranges = new ByteRange[ranges.Length];
  30. for (int i = 0; i < ranges.Length; i++)
  31. {
  32. const int start = 0, end = 1;
  33. string[] currentRange = ranges[i].Split("-".ToCharArray());
  34. if (long.TryParse(currentRange[end], out var parsedValue))
  35. {
  36. Ranges[i].End = parsedValue;
  37. }
  38. else
  39. {
  40. Ranges[i].End = contentSize - 1;
  41. }
  42. if (long.TryParse(currentRange[start], out parsedValue))
  43. {
  44. Ranges[i].Start = parsedValue;
  45. }
  46. else
  47. {
  48. Ranges[i].Start = contentSize - Ranges[i].End;
  49. Ranges[i].End = contentSize - 1;
  50. }
  51. }
  52. }
  53. }
  54. }
  55. }