C#如何实现向接收IFormFile参数的WebAPI接口上传文件
解决方案
你现有代码的核心问题是:服务端接口使用
[FromForm]接收参数,要求请求格式为multipart/form-data,但你当前是把参数序列化为JSON发送,格式完全不匹配,所以无法正常绑定参数。同时客户端不需要将本地文件转换为IFormFile或者FileStreamResult,直接构造表单内容即可完成上传。
调整后完整代码
// 1. 准备业务参数 int scenarioId = 1; // 替换为实际的场景ID值 List<string> localFilePaths = new List<string> { @"C:\本地路径\文件1.docx", @"C:\本地路径\文件2.png" // 按实际需求添加要上传的本地文件路径 }; try { using HttpClient client = new HttpClient(); // 2. 构造multipart/form-data格式的表单容器 using var formContent = new MultipartFormDataContent(); // 3. 添加普通表单字段,和服务端模型的ScenarioId属性对应 formContent.Add(new StringContent(scenarioId.ToString()), nameof(FileInputModel.ScenarioId)); // 4. 循环添加所有要上传的文件 for (int i = 0; i < localFilePaths.Count; i++) { var filePath = localFilePaths[i]; var fileStream = File.OpenRead(filePath); var streamContent = new StreamContent(fileStream); // 表单文件字段名需要和服务端模型的UploadFiles属性匹配,符合ASP.NET Core列表绑定规则 formContent.Add(streamContent, $"{nameof(FileInputModel.UploadFiles)}[{i}]", Path.GetFileName(filePath)); } // 5. 发送POST请求 HttpResponseMessage response = await client.PostAsync(url, formContent); response.EnsureSuccessStatusCode(); // 校验请求是否成功 return response; } catch (Exception ex) { // 按需处理异常逻辑 throw; }
注意事项
- 高并发场景下建议使用
IHttpClientFactory创建HttpClient实例,避免手动实例化导致的端口耗尽问题 - 大文件上传建议开启分片逻辑,避免单次请求超时、超过服务端最大请求大小限制
- 表单字段名必须和服务端
FileInputModel定义的属性名完全一致,否则服务端无法正常绑定参数
内容的提问来源于stack exchange,提问作者HamHam
相关产品推荐
相关产品推荐

