.NET Core 7 Web API与MVC:MVC传入的List<IFormFile>未被API接收
解决MVC向Web API传递List为空的问题
以下是针对该问题的具体排查和解决步骤:
1. 确保MVC端使用正确的请求格式
上传文件必须采用multipart/form-data格式,不能使用JSON请求体。在MVC项目中通过HttpClient发送请求时,需构建MultipartFormDataContent分别添加模型字段和文件:
var multipartContent = new MultipartFormDataContent(); // 逐个添加模型属性(字段名需与API模型属性完全匹配) multipartContent.Add(new StringContent(model.Title), "Title"); multipartContent.Add(new StringContent(model.Description), "Description"); // 添加文件列表,注意第二个参数的name要和API模型中List<IFormFile>的属性名一致 foreach (var file in fileDetails) { var fileStreamContent = new StreamContent(file.OpenReadStream()); fileStreamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType); multipartContent.Add(fileStreamContent, "fileDetails", file.FileName); } // 发送POST请求到API var response = await httpClient.PostAsync("api/your-upload-endpoint", multipartContent);
2. API端启用表单绑定
API的Action必须通过[FromForm]标记参数,明确告知框架从表单数据中绑定模型(包括文件):
[HttpPost("your-upload-endpoint")] public async Task<IActionResult> UploadFiles([FromForm] YourBusinessModel model) { if (model.fileDetails == null || !model.fileDetails.Any()) { return BadRequest("未接收到文件"); } // 后续保存逻辑 return Ok(); }
确保YourBusinessModel中文件列表的属性名与MVC端添加时的name完全一致:
public class YourBusinessModel { public string Title { get; set; } public string Description { get; set; } public List<IFormFile> fileDetails { get; set; } }
3. 适配嵌套模型的字段命名
如果模型是嵌套结构(比如父模型包含子对象,子对象中定义文件列表),MVC端添加字段时需要使用.分隔的命名方式:
// 示例:父模型ParentModel包含ChildModel,ChildModel中有List<IFormFile> Files属性 multipartContent.Add(fileStreamContent, "Child.Files", file.FileName);
4. 调整API的上传大小限制
若上传文件总大小超过默认限制,会导致文件被截断,进而出现列表为空的情况。可通过以下方式配置:
方式1:修改appsettings.json
{ "Kestrel": { "Limits": { "MaxRequestBodySize": 52428800 // 50MB,可按需调整 } } }
方式2:在Program.cs中配置FormOptions
builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 52428800; // 50MB options.ValueLengthLimit = int.MaxValue; });
5. 调试验证请求内容
- 在MVC端发送请求前,可通过
multipartContent.ReadAsStringAsync()查看构造的请求内容,确认文件字段是否正确添加。 - 在API端Action中直接读取
Request.Form.Files,验证请求中是否包含文件数据,以此区分是请求构造问题还是模型绑定问题。
内容的提问来源于stack exchange,提问作者Maciej Mróz
相关产品推荐
相关产品推荐

