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

如何将包含文件列表的模型提交到API,解决IFormFile反序列化报错

报错截图

报错信息:Deserialization of interface types is not supported. Type 'Microsoft.AspNetCore.Http.IFormFile'

问题根源
  • 你虽然构造了FormData实例,但最终POST请求提交的还是原始的JSON格式model对象,ASP.NET Core的JSON序列化器无法反序列化IFormFile这类接口类型的属性,只有请求格式为multipart/form-data时,框架才会自动解析文件到IFormFile属性
  • FormData字段构造逻辑错误,循环追加文件时用了重复的key,且字段名和后端模型属性名不匹配,导致参数绑定失败
  • 冗余代码:new Blob([JSON.stringify({})], { type: 'application/json' });没有被赋值或使用,没有实际作用
修复方案

前端修正后代码

submit(model: Model): Observable<any> {
  const fd = new FormData();
  // 追加其他业务字段,根据你实际的模型属性调整字段名
  fd.append('title', model.title);
  fd.append('amount', model.amount?.toString());
  // 追加多文件,key和后端模型的文件集合属性名保持一致
  for (let i = 0; i < model.files.length; i++) {
    fd.append(`files[${i}]`, model.files[i]);
  }
  // 提交FormData实例,不要传原始model,不需要手动设置Content-Type请求头
  return this.http.post(`${this.apiUrl}/API/Submit`, fd);
}

后端对应代码

接收模型定义

public class SubmitModel
{
    // 替换为你实际的业务字段
    public string Title { get; set; }
    public int Amount { get; set; }
    // 多文件集合属性
    public List<IFormFile> Files { get; set; }
}

接口方法定义

[ApiController]
[Route("API")]
public class ApiController : ControllerBase
{
    [HttpPost("Submit")]
    // 必须加[FromForm]特性,指定从表单数据绑定模型
    public IActionResult Submit([FromForm] SubmitModel model)
    {
        // 处理业务逻辑
        return Ok();
    }
}
注意事项
  • 不要手动给请求添加Content-Type: multipart/form-data请求头,浏览器会自动生成带边界标识的请求头,手动设置会导致边界缺失,框架无法解析表单数据
  • 如果业务字段存在嵌套对象,比如模型里有Order类型的属性,下属OrderNo字段,FormData对应的key要写为order.orderNo,和后端模型层级保持对应即可正常绑定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:57:04