ASP.NET Core 2.0文件上传接口接收文件为Null的问题排查
你的后端Action代码逻辑是没问题的,导致IFormFile始终为null的原因完全出在控制台客户端的请求构建上,有几个关键配置错误:
ContentDisposition的Name参数不匹配
后端Action的参数名是file,但你在客户端里把ContentDispositionHeaderValue的Name设置成了文件路径"D://Infos.txt"。ASP.NET Core的模型绑定是根据表单字段名来匹配参数的,字段名不对应就找不到数据,所以这里必须改成和后端参数一致的"file"。另外FileName也不需要带完整路径,只保留文件名"Infos.txt"即可,避免服务器端处理路径时出现异常。StreamContent的ContentType设置错误
你给单个文件的StreamContent设置了multipart/form-data,但这个类型是整个表单请求的Content-Type,单个文件应该使用对应文件的实际类型(比如文本文件用text/plain),或者用通用的二进制类型application/octet-stream。MultipartFormDataContent会自动处理整个请求的multipart类型,不需要单独给文件流设置。额外优化:异步调用规范
客户端里用response.Result会阻塞线程,建议改用await异步调用,让代码更符合.NET的异步规范。
下面是修复后的完整客户端代码:
static async Task Main(string[] args) { using var stream = new FileStream("D://Infos.txt", FileMode.Open); var fileStreamContent = new StreamContent(stream); // 修正ContentDisposition:Name匹配后端参数名,FileName只保留文件名 fileStreamContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "file", FileName = "Infos.txt" }; // 修正ContentType为文件实际类型,这里用文本文件的类型示例 fileStreamContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/plain"); using var client = new HttpClient(); using var formData = new MultipartFormDataContent(); formData.Add(fileStreamContent); // 改用await异步调用 var response = await client.PostAsync("http://localhost:2184/api/values", formData); Console.WriteLine(response.IsSuccessStatusCode); Console.ReadKey(); }
把客户端代码改成这样后,后端的IFormFile file就能正常接收到上传的文件了。
内容的提问来源于stack exchange,提问作者eyvaz

