Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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();
            }
        }