public static HttpHeaderVariable Init(HttpRequestBase request) { HttpHeaderVariable r = new HttpHeaderVariable(); r.Range = new ContentRange(); var ifRanges = request.Headers.GetValues("If-Range"); if (ifRanges != null) { r.IsContanisIfRange = true; r.IfRangeString = ifRanges[0]; } var ifModifies = request.Headers.GetValues("If-Modified-Since"); if (ifModifies != null) { r.IsContainsModify = true; r.SinceModify = Convert.ToDateTime(ifModifies[0]); } var ifUnmodifies = request.Headers.GetValues("If-Unmodified-Since"); if (ifUnmodifies != null) { r.IsContainsUnmodified = true; r.SinceUnmodify = Convert.ToDateTime(ifUnmodifies[0]); } var ranges = request.Headers.GetValues("Range"); if (ranges != null) { r.IsContainsRange = true; var range = ranges[0]; int indexD = range.IndexOf('='); int indexJ = range.IndexOf('-'); r.Range.Start = Convert.ToInt32(range.Substring(indexD + 1, indexJ - indexD - 1)); if (indexJ == range.Length - 1) { r.Range.End = 0; } else { r.Range.End = Convert.ToInt32(range.Substring(indexJ + 1, range.Length - indexJ - 1)); } } return(r); }
/// <summary> /// 播放或者下载视频都可以调这个方法 /// </summary> /// <param name="path"></param> /// <param name="Request"></param> /// <param name="Response"></param> public static void PlayOrDownloadVideo(string path, HttpRequestBase Request, HttpResponseBase Response) { FileStream stm = null; try { Response.CacheControl = "public"; FileInfo fi = new FileInfo(path); stm = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read); var vary = HttpHeaderVariable.Init(Request); vary.Range.Total = fi.Length; if (vary.Range.End == 0 || vary.Range.End > vary.Range.Total - 1) { vary.Range.End = vary.Range.Total - 1; } if (vary.IsContainsModify) { if (fi.LastWriteTimeUtc <= vary.SinceModify) { Response.StatusCode = 304; Response.Headers.Add("Etag", GetEtag(fi)); Response.End(); } } if (vary.IsContanisIfRange) { if (GetEtag(fi) == vary.IfRangeString) { Response.StatusCode = 206; Response.Headers.Add("Etag", GetEtag(fi)); }//get all else { vary.Range.Start = 0; vary.Range.End = vary.Range.Total - 1; } } if (vary.IsContainsRange) { Response.StatusCode = 206; } else { Response.StatusCode = 200; } Response.AddHeader("Accept-Ranges", "bytes"); Response.AddHeader("Connection", "keep-alive"); Response.AddHeader("Content-Length", vary.Range.Length.ToString()); Response.AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", vary.Range.Start, vary.Range.End, vary.Range.Total)); Response.ContentType = "video/mp4"; Response.Cache.SetMaxAge(TimeSpan.FromHours(1)); Response.Cache.SetETag(GetEtag(fi)); Response.Cache.SetExpires(DateTime.Now.AddDays(3)); Response.Cache.SetLastModified(fi.LastWriteTime); stm.Position = vary.Range.Start; long totalLength = vary.Range.Length; var buffer = new byte[1024]; int n = 1; while (totalLength > 0 && n > 0) { n = stm.Read(buffer, 0, (int)Math.Min(totalLength, buffer.Length)); Response.OutputStream.Write(buffer, 0, n); totalLength -= n; } } finally { if (stm != null) { stm.Dispose(); } Response.End(); } }