您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

2026-03-31 09:131阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1028个文字,预计阅读时间需要5分钟。

您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

目录 + 解析辅助类 + 应用示例 + 使用WebSocketSharp自定义实现Web服务时,无法解析multipart/form-data请求的数据。

通过查找资料,采用以下方式实现multipart/form-data的解析器:

解析辅助类 + 使用Sy

csharpusing System;using System.Net;using System.IO;using System.Collections.Generic;

public class MultipartFormDataParser{ public static Dictionary ParseMultipartFormData(string data) { var formData=new Dictionary(); var boundary=GetBoundary(data); var parts=data.Split(new[] { -- + boundary }, StringSplitOptions.None);

for (int i=1; i

var name=ParseHeaderValue(headers, Content-Disposition); if (name !=null) { var fileName=ParseHeaderValue(headers, Content-Disposition).Substring(name.IndexOf(filename=\) + 10); fileName=fileName.Substring(0, fileName.IndexOf(\));

if (fileName !=null) { formData[name]=fileName; } else { formData[name]=body; } } }

return formData; }

private static string GetBoundary(string data) { var index=data.IndexOf(boundary=); if (index !=-1) { return data.Substring(index + 9, data.IndexOf(\n, index + 9) - (index + 9)); } return null; }

private static string ParseHeaderValue(string headers, string headerName) { var headerValue=headers.Split(new[] { \r\n }, StringSplitOptions.RemoveEmptyEntries) .FirstOrDefault(h=> h.StartsWith(headerName + :)); if (headerValue !=null) { return headerValue.Substring(headerName.Length + 1).Trim(); } return null; }}

目录
  • 解析辅助类
  • 调用示例

使用WebSocketSharp自定义实现Web服务时,无法解析multipart/form-data请求的数据。

通过查找资料,采用以下方式实现multipart/form-data的解析器。

解析辅助类

using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace YongFrame.Common.Utils { /// <summary> /// multipart/form-data的解析器 /// </summary> internal class HttpMultipartParser { /// <summary> /// 参数集合 /// </summary> public IDictionary<string, string> Parameters = new Dictionary<string, string>(); /// <summary> /// 上传文件部分参数 /// </summary> public string FilePartName { get; } /// <summary> /// 是否解析成功 /// </summary> public bool Success { get; private set; } /// <summary> /// 请求类型 /// </summary> public string ContentType { get; private set; } /// <summary> /// 上传的文件名 /// </summary> public string Filename { get; private set; } /// <summary> /// 上传的文件内容 /// </summary> public byte[] FileContents { get; private set; } /// <summary> /// 解析multipart/form-data格式的文件请求,默认编码为utf8 /// </summary> /// <param name="stream"></param> /// <param name="filePartName"></param> public HttpMultipartParser(Stream stream, string filePartName) { FilePartName = filePartName; Parse(stream, Encoding.UTF8); } /// <summary> /// 解析multipart/form-data格式的字符串 /// </summary> /// <param name="content"></param> public HttpMultipartParser(string content) { var array = Encoding.UTF8.GetBytes(content); var stream = new MemoryStream(array); Parse(stream, Encoding.UTF8); } /// <summary> /// 解析multipart/form-data格式的文件请求 /// </summary> /// <param name="stream"></param> /// <param name="encoding">编码</param> /// <param name="filePartName"></param> public HttpMultipartParser(Stream stream, Encoding encoding, string filePartName) { FilePartName = filePartName; Parse(stream, encoding); } private void Parse(Stream stream, Encoding encoding) { Success = false; var data = ToByteArray(stream); var content = encoding.GetString(data); var delimiterEndIndex = content.IndexOf("\r\n", StringComparison.Ordinal); if (delimiterEndIndex > -1) { var delimiter = content.Substring(0, content.IndexOf("\r\n", StringComparison.Ordinal)).Trim(); var sections = content.Split(new[] {delimiter}, StringSplitOptions.RemoveEmptyEntries); foreach (var s in sections) { if (s.Contains("Content-Disposition")) { var nameMatch = new Regex(@"(?<=name\=\"")(.*?)(?=\"")").Match(s); var name = nameMatch.Value.Trim().ToLower(); if (name == FilePartName && !string.IsNullOrEmpty(FilePartName)) { var re = new Regex(@"(?<=Content\-Type:)(.*?)(?=\r\n\r\n)"); var contentTypeMatch = re.Match(content); re = new Regex(@"(?<=filename\=\"")(.*?)(?=\"")"); var filenameMatch = re.Match(content); if (contentTypeMatch.Success && filenameMatch.Success) { ContentType = contentTypeMatch.Value.Trim(); Filename = filenameMatch.Value.Trim(); var startIndex = contentTypeMatch.Index + contentTypeMatch.Length + "\r\n\r\n".Length; var delimiterBytes = encoding.GetBytes("\r\n" + delimiter); var endIndex = IndexOf(data, delimiterBytes, startIndex); var contentLength = endIndex - startIndex; var fileData = new byte[contentLength]; Buffer.BlockCopy(data, startIndex, fileData, 0, contentLength); FileContents = fileData; } } else if (!string.IsNullOrWhiteSpace(name)) { var startIndex = nameMatch.Index + nameMatch.Length + "\r\n\r\n".Length; Parameters.Add(name, s.Substring(startIndex).TrimEnd('\r', '\n').Trim()); } } } if (FileContents != null || Parameters.Count != 0) { Success = true; } } } public static int IndexOf(byte[] searchWithin, byte[] serachFor, int startIndex) { var index = 0; var startPos = Array.IndexOf(searchWithin, serachFor[0], startIndex); if (startPos != -1) { while (startPos + index < searchWithin.Length) { if (searchWithin[startPos + index] == serachFor[index]) { index++; if (index == serachFor.Length) { return startPos; } } else { startPos = Array.IndexOf(searchWithin, serachFor[0], startPos + index); if (startPos == -1) { return -1; } index = 0; } } } return -1; } public static byte[] ToByteArray(Stream stream) { var buffer = new byte[32768]; using (var ms = new MemoryStream()) { while (true) { var read = stream.Read(buffer, 0, buffer.Length); if (read <= 0) { return ms.ToArray(); } ms.Write(buffer, 0, read); } } } } }

您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

调用示例

 HttpMultipartParser parser = new HttpMultipartParser(paramData);             if (!parser.Success)             {                 result.Code = -1;                 result.Message = "请求数据格式不能正确";                 return result;             }             if (!parser.Parameters.ContainsKey("optid") || parser.Parameters["optid"] == null || string.IsNullOrEmpty(parser.Parameters["optid"]))             {                 result.Code = -1;                 result.Message = "用户名不能为空";                 return result;             }

public void Upload(Stream stream) {     HttpMultipartParser parser = new HttpMultipartParser(stream, "image");       if (parser.Success)     {         string user = HttpUtility.UrlDecode(parser.Parameters["user"]);         string title = HttpUtility.UrlDecode(parser.Parameters["title"]);           // Save the file somewhere         File.WriteAllBytes(FILE_PATH + title + FILE_EXT, parser.FileContents);     } }  

以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

标签:

本文共计1028个文字,预计阅读时间需要5分钟。

您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

目录 + 解析辅助类 + 应用示例 + 使用WebSocketSharp自定义实现Web服务时,无法解析multipart/form-data请求的数据。

通过查找资料,采用以下方式实现multipart/form-data的解析器:

解析辅助类 + 使用Sy

csharpusing System;using System.Net;using System.IO;using System.Collections.Generic;

public class MultipartFormDataParser{ public static Dictionary ParseMultipartFormData(string data) { var formData=new Dictionary(); var boundary=GetBoundary(data); var parts=data.Split(new[] { -- + boundary }, StringSplitOptions.None);

for (int i=1; i

var name=ParseHeaderValue(headers, Content-Disposition); if (name !=null) { var fileName=ParseHeaderValue(headers, Content-Disposition).Substring(name.IndexOf(filename=\) + 10); fileName=fileName.Substring(0, fileName.IndexOf(\));

if (fileName !=null) { formData[name]=fileName; } else { formData[name]=body; } } }

return formData; }

private static string GetBoundary(string data) { var index=data.IndexOf(boundary=); if (index !=-1) { return data.Substring(index + 9, data.IndexOf(\n, index + 9) - (index + 9)); } return null; }

private static string ParseHeaderValue(string headers, string headerName) { var headerValue=headers.Split(new[] { \r\n }, StringSplitOptions.RemoveEmptyEntries) .FirstOrDefault(h=> h.StartsWith(headerName + :)); if (headerValue !=null) { return headerValue.Substring(headerName.Length + 1).Trim(); } return null; }}

目录
  • 解析辅助类
  • 调用示例

使用WebSocketSharp自定义实现Web服务时,无法解析multipart/form-data请求的数据。

通过查找资料,采用以下方式实现multipart/form-data的解析器。

解析辅助类

using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace YongFrame.Common.Utils { /// <summary> /// multipart/form-data的解析器 /// </summary> internal class HttpMultipartParser { /// <summary> /// 参数集合 /// </summary> public IDictionary<string, string> Parameters = new Dictionary<string, string>(); /// <summary> /// 上传文件部分参数 /// </summary> public string FilePartName { get; } /// <summary> /// 是否解析成功 /// </summary> public bool Success { get; private set; } /// <summary> /// 请求类型 /// </summary> public string ContentType { get; private set; } /// <summary> /// 上传的文件名 /// </summary> public string Filename { get; private set; } /// <summary> /// 上传的文件内容 /// </summary> public byte[] FileContents { get; private set; } /// <summary> /// 解析multipart/form-data格式的文件请求,默认编码为utf8 /// </summary> /// <param name="stream"></param> /// <param name="filePartName"></param> public HttpMultipartParser(Stream stream, string filePartName) { FilePartName = filePartName; Parse(stream, Encoding.UTF8); } /// <summary> /// 解析multipart/form-data格式的字符串 /// </summary> /// <param name="content"></param> public HttpMultipartParser(string content) { var array = Encoding.UTF8.GetBytes(content); var stream = new MemoryStream(array); Parse(stream, Encoding.UTF8); } /// <summary> /// 解析multipart/form-data格式的文件请求 /// </summary> /// <param name="stream"></param> /// <param name="encoding">编码</param> /// <param name="filePartName"></param> public HttpMultipartParser(Stream stream, Encoding encoding, string filePartName) { FilePartName = filePartName; Parse(stream, encoding); } private void Parse(Stream stream, Encoding encoding) { Success = false; var data = ToByteArray(stream); var content = encoding.GetString(data); var delimiterEndIndex = content.IndexOf("\r\n", StringComparison.Ordinal); if (delimiterEndIndex > -1) { var delimiter = content.Substring(0, content.IndexOf("\r\n", StringComparison.Ordinal)).Trim(); var sections = content.Split(new[] {delimiter}, StringSplitOptions.RemoveEmptyEntries); foreach (var s in sections) { if (s.Contains("Content-Disposition")) { var nameMatch = new Regex(@"(?<=name\=\"")(.*?)(?=\"")").Match(s); var name = nameMatch.Value.Trim().ToLower(); if (name == FilePartName && !string.IsNullOrEmpty(FilePartName)) { var re = new Regex(@"(?<=Content\-Type:)(.*?)(?=\r\n\r\n)"); var contentTypeMatch = re.Match(content); re = new Regex(@"(?<=filename\=\"")(.*?)(?=\"")"); var filenameMatch = re.Match(content); if (contentTypeMatch.Success && filenameMatch.Success) { ContentType = contentTypeMatch.Value.Trim(); Filename = filenameMatch.Value.Trim(); var startIndex = contentTypeMatch.Index + contentTypeMatch.Length + "\r\n\r\n".Length; var delimiterBytes = encoding.GetBytes("\r\n" + delimiter); var endIndex = IndexOf(data, delimiterBytes, startIndex); var contentLength = endIndex - startIndex; var fileData = new byte[contentLength]; Buffer.BlockCopy(data, startIndex, fileData, 0, contentLength); FileContents = fileData; } } else if (!string.IsNullOrWhiteSpace(name)) { var startIndex = nameMatch.Index + nameMatch.Length + "\r\n\r\n".Length; Parameters.Add(name, s.Substring(startIndex).TrimEnd('\r', '\n').Trim()); } } } if (FileContents != null || Parameters.Count != 0) { Success = true; } } } public static int IndexOf(byte[] searchWithin, byte[] serachFor, int startIndex) { var index = 0; var startPos = Array.IndexOf(searchWithin, serachFor[0], startIndex); if (startPos != -1) { while (startPos + index < searchWithin.Length) { if (searchWithin[startPos + index] == serachFor[index]) { index++; if (index == serachFor.Length) { return startPos; } } else { startPos = Array.IndexOf(searchWithin, serachFor[0], startPos + index); if (startPos == -1) { return -1; } index = 0; } } } return -1; } public static byte[] ToByteArray(Stream stream) { var buffer = new byte[32768]; using (var ms = new MemoryStream()) { while (true) { var read = stream.Read(buffer, 0, buffer.Length); if (read <= 0) { return ms.ToArray(); } ms.Write(buffer, 0, read); } } } } }

您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

调用示例

 HttpMultipartParser parser = new HttpMultipartParser(paramData);             if (!parser.Success)             {                 result.Code = -1;                 result.Message = "请求数据格式不能正确";                 return result;             }             if (!parser.Parameters.ContainsKey("optid") || parser.Parameters["optid"] == null || string.IsNullOrEmpty(parser.Parameters["optid"]))             {                 result.Code = -1;                 result.Message = "用户名不能为空";                 return result;             }

public void Upload(Stream stream) {     HttpMultipartParser parser = new HttpMultipartParser(stream, "image");       if (parser.Success)     {         string user = HttpUtility.UrlDecode(parser.Parameters["user"]);         string title = HttpUtility.UrlDecode(parser.Parameters["title"]);           // Save the file somewhere         File.WriteAllBytes(FILE_PATH + title + FILE_EXT, parser.FileContents);     } }  

以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

标签: