ASP.NET Core POST请求如何同时接收[FromBody]类对象与IFormFile参数
你当前的接口配置无法同时接收JSON对象和文件,原因有两个:
- 接口标注了
[Consumes("application/json")],仅支持JSON格式的请求体,而文件上传必须使用multipart/form-data格式的请求体,二者互斥 [FromBody]特性会绑定整个请求体的内容到CNCTask对象,没有多余空间容纳文件内容
方案1:使用DTO封装所有请求参数(推荐)
步骤1:创建统一请求DTO
// 新增请求传输类 public class CNCTaskUploadRequest { public CNCTask TaskInfo { get; set; } public IFormFile UploadFile { get; set; } }
步骤2:修改控制器接口配置
[HttpPost("TaskUpload")] // 把接收格式改为multipart/form-data [Consumes("multipart/form-data")] // 用[FromForm]绑定整个form-data内容到DTO public async Task<ActionResult<CNCTask>> Post([FromForm] CNCTaskUploadRequest request) { // 业务逻辑:request.TaskInfo 就是CNCTask对象,request.UploadFile 就是上传的文件 }
方案2:直接拆分为两个Form参数
如果你不想新增DTO,也可以直接修改接口参数的绑定特性:
[HttpPost("TaskUpload")] [Consumes("multipart/form-data")] public async Task<ActionResult<CNCTask>> Post([FromForm] CNCTask task, [FromForm] IFormFile file) { // 直接取task和file参数即可 }
Postman测试步骤
- 新建POST请求,填入你的接口地址
- 切换到
Body标签,选择form-data格式 - 按层级填写CNCTask的字段:
- 用方案2的话:键填
description,值填truc;键填completion,值填24;键填machine.hostname,值填some host;键填machine.port,值填1234 - 用方案1的话:键统一加前缀
TaskInfo.,比如TaskInfo.description、TaskInfo.machine.hostname即可
- 用方案2的话:键填
- 新增文件字段:键填
file(方案1填UploadFile),鼠标移到key输入框右侧的类型下拉框,选择File,然后点击Select Files选择本地要上传的文件 - 点击Send即可发起请求,后端可以正常拿到所有参数
内容的提问来源于stack exchange,提问作者JetsON
相关产品推荐
相关产品推荐

