You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:41:00