/// <summary> /// 显示文件 /// </summary> /// <param name="filename"></param> private void ShowFile(string filename, string name, RequestInfo request, ResponseInfo response) { FileInfo finf = new FileInfo(filename); response.MimeType = WebCommon.GetContentType(finf.Extension.Trim('.')); string strName = RequestInfo.GetFileName(request, name); response.Header["Content-Disposition"] = "attachment;filename=" + strName; long len = finf.Length; response.Header["Accept-Ranges"] = "bytes"; response.Header["Content-Transfer-Encoding"] = "binary"; if (request.Header.ContainsKey("range")) //如果客户端指定了分段下载 { List <RangeInfo> lstRange = ResponseInfo.GetRange(request.Header["Range"], finf.Length); //处理区段信息 if (lstRange.Count > 0) { response.Header["Content-Range"] = "bytes " + lstRange[0].Start + "-" + lstRange[0].End + "/" + finf.Length;//指定区段 response.StatusCode = 206; } } try { response.UserTag = finf; response.Length = len; response.RangeLength = finf.Length; } catch (Exception ex) { response.Write("数据读取失败:" + ex.Message); } }
void _server_OnRequestSendingBody(RequestInfo request, ResponseInfo response, System.Net.Sockets.Socket requestSocket) { if (response.UserTag != null) { FileInfo finf = response.UserTag as FileInfo; RangeInfo range = null; if (request.Header.ContainsKey("range")) { List <RangeInfo> lstRange = ResponseInfo.GetRange(request.Header["Range"], finf.Length); if (lstRange.Count > 0) { range = lstRange[0]; } } if (range == null) { range = new RangeInfo(); range.End = finf.Length - 1; } if (finf != null) { byte[] buff = new byte[512 * 1024]; int read = 0; using (FileStream stm = finf.Open(FileMode.Open)) { stm.Position = range.Start; long totleLen = range.Length; while (true) { read = stm.Read(buff, 0, buff.Length); if (read > totleLen) { read = (int)totleLen; } if (read > 0) { requestSocket.Send(buff, 0, read, SocketFlags.None); totleLen -= read; } if (read <= 0 || totleLen <= 0) { break; } } } } } }