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
相关产品推荐
相关产品推荐

