public static HttpRequestRange New(HttpRequest request) { var rangeStr = request.Headers["Range"]; if (string.IsNullOrEmpty(rangeStr)) { return(HttpRequestRange.Empty); } rangeStr = rangeStr.Replace("bytes=", string.Empty); if (string.IsNullOrEmpty(rangeStr)) { return(HttpRequestRange.Empty); } HttpRequestRange range = new HttpRequestRange(); if (rangeStr.IndexOf('-') == -1) { //Range bytes=1000 传输最后1000个字节。 range.LastBytes = int.Parse(rangeStr); } else { //bytes=0- 或者 bytes=1000-2000 var temp = rangeStr.Split('-'); range.StartIndex = long.Parse(temp[0]); range.EndIndex = (temp.Length > 1 && !string.IsNullOrEmpty(temp[1])) ? long.Parse(temp[1]) : -1; } return(range); }
protected override void ProcessGET() { var range = HttpRequestRange.New(this.Request); if (!range.IsEmpty()) { var size = GetFileSize(); long offset = 0; long count = 0; //分段读取 range.Process(this.Response, size, out offset, out count); byte[] buffer = ReadFileBuffer(offset, (int)count); this.Response.BinaryWrite(buffer); this.Response.Flush(); } else { //普通文件 var size = GetFileSize(); int bufferSize = GetBufferSize(size); long offset = 0; while (offset < size) { byte[] buffer = ReadFileBuffer(offset, bufferSize); this.Response.BinaryWrite(buffer); this.Response.Flush(); offset += buffer.Length; } } }