/// <summary> /// 解析文件表单数据 /// </summary> /// <param name="request"></param> /// <param name="body"></param> private static void AnalyzeFormDataBody(this HttpRequest request, string body, int from, int to, byte[] reqData) { try { var boundary = request.Headers["Content-Type"].Split(';')[1].Trim().Split('=')[1]; var files = new List <HttpRequestFile>(); var splitWord = $"--{boundary}"; foreach (var item in body.Split(new String[] { splitWord }, StringSplitOptions.None)) { if (string.IsNullOrEmpty(item) || string.IsNullOrWhiteSpace(item)) { from = from + item.Length; continue; } from += splitWord.Length; if (item.Trim() == "--") { break; } var fileInfo = new HttpRequestFile(); var splitIndex = item.IndexOf("\r\n\r\n"); var formHeader = GetEncodedStr(from, from + splitIndex, reqData, Encoding.UTF8);// item.Substring(0, splitIndex); fileInfo.AnalyzeFormHeader(formHeader); var formbody = item.Substring(splitIndex + 4, item.Length - splitIndex - 6); from += splitIndex + 4; to = from + formbody.Length; //有文件名的才当作文件看待 if (!string.IsNullOrEmpty(fileInfo.Filename)) { fileInfo.AnalyzeFormBody(from, to, reqData); files.Add(fileInfo); } else { body = GetEncodedStr(from, to, reqData, Encoding.UTF8); request.Form.Add(fileInfo.Name, formbody); } from = to + 2; } request.Files = files; } catch (Exception) { } }
/// <summary> /// 解析表单内容 /// </summary> /// <param name="fileInfo"></param> /// <param name="formBody"></param> private static void AnalyzeFormBody(this HttpRequestFile fileInfo, int from, int to, byte[] reqData) { try { var buffer = reqData.Skip(from).Take(to - from).ToArray(); var fstream = new MemoryStream(); fstream.Write(buffer, 0, buffer.Length); fstream.Flush(); fstream.Position = 0; fileInfo.FileStream = fstream; } catch (Exception) { } }
/// <summary> /// 处理文件头部 /// </summary> /// <param name="request"></param> /// <param name="formHeader"></param> private static void AnalyzeFormHeader(this HttpRequestFile fileInfo, string formHeader) { try { var lines = formHeader.Split(new String[] { "\r\n" }, StringSplitOptions.None); foreach (var line in lines) { if (string.IsNullOrEmpty(line)) { continue; } var lineInfo = line.Split(':'); if (lineInfo[0] == "Content-Disposition") { foreach (var item in lineInfo[1].Split(';')) { var itemInfo = item.Split('='); if (itemInfo[0].Trim().Equals("name")) { fileInfo.Name = item.Split('=')[itemInfo.Length - 1].Trim('"'); } if (itemInfo[0].Trim().Equals("filename")) { fileInfo.Filename = item.Split('=')[itemInfo.Length - 1].Trim('"'); } } } else if (lineInfo[0] == "Content-Type") { fileInfo.ContentType = lineInfo[1].Trim(); } } } catch (Exception) { } }