.NET Lambda注解框架中解析multipart/form-data及实现ParseMultipartFormData函数
.NET Lambda注解框架中解析multipart/form-data的实现代码
以下是适配APIGatewayHttpApiV2ProxyRequest的ParseMultipartFormData函数实现,用于解析multipart/form-data格式的请求体:
using System; using System.Collections.Generic; using System.IO; using System.Net.Http; using System.Net.Http.Headers; using System.Text; private Dictionary<string, byte[]> ParseMultipartFormData(string base64Body, string contentType) { var formData = new Dictionary<string, byte[]>(); // 解码base64编码的请求体字节流 var bodyBytes = Convert.FromBase64String(base64Body); using var bodyStream = new MemoryStream(bodyBytes); // 从Content-Type头中提取multipart边界标识 var boundary = GetBoundary(contentType); if (string.IsNullOrEmpty(boundary)) { throw new InvalidOperationException("无法从Content-Type头中解析multipart边界"); } var reader = new MultipartReader(boundary, bodyStream); MultipartSection section; // 遍历所有multipart分段 while ((section = reader.ReadNextSectionAsync().Result) != null) { var contentDisposition = ContentDispositionHeaderValue.Parse(section.ContentDisposition); var fieldName = contentDisposition.Name.Trim('"'); // 读取当前分段的内容到字节数组 using var contentStream = new MemoryStream(); section.Body.CopyTo(contentStream); formData.Add(fieldName, contentStream.ToArray()); } return formData; } // 辅助方法:从Content-Type头中提取边界字符串 private string GetBoundary(string contentType) { var headerElements = contentType.Split(';'); foreach (var element in headerElements) { var keyValue = element.Trim().Split('='); if (keyValue.Length == 2 && keyValue[0].Equals("boundary", StringComparison.OrdinalIgnoreCase)) { return keyValue[1].Trim('"'); } } return null; }
关键说明
- 由于
APIGatewayHttpApiV2ProxyRequest的Body是base64编码格式,所以第一步需要解码为字节流 - 通过
Content-Type头中的boundary参数识别multipart分段的分隔符 - 函数返回
Dictionary<string, byte[]>,键为表单字段名,值为字段对应的字节内容(文件或普通文本都以字节数组存储) - 如果需要区分文件和普通文本字段,可以通过
contentDisposition.FileName判断:存在该值则为文件,否则可通过Encoding.UTF8.GetString()将字节数组转为字符串
调用示例
[LambdaFunction()] [HttpApi(LambdaHttpMethod.Post, "/create")] public async Task<IActionResult> AddEntity([FromBody] APIGatewayHttpApiV2ProxyRequest request) { var contentType = request.Headers["content-type"]; if (contentType.Contains("multipart/form-data")) { var formData = ParseMultipartFormData(request.Body, contentType); var fileContent = formData["file"]; // 处理文件内容,例如上传至S3 // 处理普通文本字段示例 // var username = Encoding.UTF8.GetString(formData["username"]); } return Ok(new { message = "Data added successfully" }); }
内容的提问来源于stack exchange,提问作者Karthick J
相关产品推荐
相关产品推荐

