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

Minimal API使用multipart/form-data与自定义模型时触发415错误

解决ASP.NET Core多文件上传端点415媒体类型错误

问题原因

415错误的核心原因是:ASP.NET Core默认会将复杂类型参数(如你的MultipleFormularyFilesRequest)按JSON格式解析,但你的请求发送的是multipart/form-data类型,框架无法自动匹配解析方式,因此抛出媒体类型不支持的异常。

解决方案

在端点的模型参数前添加[FromForm]特性,明确告知框架从表单数据(multipart/form-data)中绑定模型属性。

修改后的端点代码

app.MapPost("formulary/uploadMultiple",
            async ([FromForm] MultipleFormularyFilesRequest request) =>
            {
                // 在这里处理两个文件和参数
                if (request.FirstFile != null)
                {
                    // 示例:保存FirstFile到本地
                    using var stream = new FileStream($"uploads/{request.FirstFile.FileName}", FileMode.Create);
                    await request.FirstFile.CopyToAsync(stream);
                }

                if (request.SecondFile != null)
                {
                    // 示例:保存SecondFile到本地
                    using var stream = new FileStream($"uploads/{request.SecondFile.FileName}", FileMode.Create);
                    await request.SecondFile.CopyToAsync(stream);
                }

                return Results.Ok(new { message = "文件上传成功" });
            }).Accepts<MultipleFormularyFilesRequest>("multipart/form-data")
            .Produces(StatusCodes.Status200OK)
            .Produces(StatusCodes.Status400BadRequest);

保持模型不变

你的自定义请求模型无需修改:

public class MultipleFormularyFilesRequest
{
    public string OldExternalSystemName { get; set; }

    public string NewExternalSystemName { get; set; }

    public IFormFile FirstFile { get; set; }

    public IFormFile SecondFile { get; set; }
}

可选:贴合单文件端点的路径参数结构

如果你希望保持和单文件端点一致的路径参数(oldSys和newSys放在URL路径中),可以拆分参数:

调整后的模型

public class MultipleFilesRequest
{
    public IFormFile FirstFile { get; set; }
    public IFormFile SecondFile { get; set; }
}

调整后的端点

app.MapPost("formulary/uploadMultiple/{oldSys}/{newSys}",
            async (string oldSys, string newSys, [FromForm] MultipleFilesRequest filesRequest) =>
            {
                // 使用oldSys、newSys和filesRequest中的文件进行处理
                return Results.Ok(new { 
                    oldSystem = oldSys, 
                    newSystem = newSys,
                    firstFileName = filesRequest.FirstFile?.FileName,
                    secondFileName = filesRequest.SecondFile?.FileName
                });
            }).Accepts<MultipleFilesRequest>("multipart/form-data")
            .Produces(StatusCodes.Status200OK)
            .Produces(StatusCodes.Status400BadRequest);

验证效果

修改后,Swagger UI会正常发送multipart/form-data请求,ASP.NET Core能正确解析表单中的文本参数和两个文件,不再抛出415错误。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:06:27