如何在Postman的JSON [FromBody]中指定文件路径?ASP.NET Core API空值问题
为什么你的IFormFile获取为空?以及正确的文件上传方式
首先直接给结论:你不能通过在JSON请求体里传递本地文件路径的方式,让ASP.NET Core Web API接收到有效的IFormFile,原因主要有两个:
- 请求格式不匹配:IFormFile是ASP.NET Core专门为
multipart/form-data类型的请求设计的,用来解析表单中的文件上传字段。而你发送的是JSON格式(application/json)的请求,服务器端不会把字符串形式的文件路径自动转换成IFormFile对象,自然就会为空。 - 安全限制:服务器根本无法访问客户端的本地文件系统——你传的
C:\xyz\abc\test.txt是客户端机器上的路径,服务器没有权限读取这个路径下的文件,就算你把路径传过去,也没法获取到文件内容。
正确的实现步骤
第一步:编写Web API的控制器和模型
你需要创建一个接收multipart/form-data请求的控制器方法,搭配对应的模型类:
[ApiController] [Route("api/[controller]")] public class FileUploadController : ControllerBase { [HttpPost("upload")] public async Task<IActionResult> UploadFile([FromForm] FileUploadModel model) { // 校验文件是否存在 if (model.FormFile == null || model.FormFile.Length == 0) { return BadRequest("请上传有效的文件"); } // 示例:将文件保存到服务器指定目录 var saveDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Uploads"); if (!Directory.Exists(saveDirectory)) { Directory.CreateDirectory(saveDirectory); } var filePath = Path.Combine(saveDirectory, model.FormFile.FileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await model.FormFile.CopyToAsync(stream); } return Ok(new { Id = model.Id, Name = model.Name, UploadedFileName = model.FormFile.FileName, SavedPath = filePath }); } } // 对应的模型类,用来接收表单中的字段和文件 public class FileUploadModel { public string Id { get; set; } public string Name { get; set; } public IFormFile FormFile { get; set; } }
第二步:客户端发送正确的请求
客户端需要以multipart/form-data格式发送请求,而不是JSON。下面给两种常见的客户端实现方式:
方式1:用Postman测试
- 选择POST请求,URL填写你的API地址(比如
http://localhost:5000/api/FileUpload/upload) - 切换到Body标签,选择
form-data类型 - 添加三个字段:
Id:值填1Name:值填ShekharFormFile:类型选择File,然后点击右侧的文件选择按钮,选中本地的test.txt文件
- 点击发送,就能看到服务器返回的成功响应了
方式2:用C# HttpClient代码发送请求
如果是代码客户端,可以这样写:
using System.Net.Http; using System.Net.Http.Headers; using System.IO; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { var apiUrl = "http://localhost:5000/api/FileUpload/upload"; var filePath = @"C:\xyz\abc\test.txt"; using (var httpClient = new HttpClient()) using (var formData = new MultipartFormDataContent()) { // 添加普通文本字段 formData.Add(new StringContent("1"), "Id"); formData.Add(new StringContent("Shekhar"), "Name"); // 添加文件内容 using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { var fileContent = new StreamContent(fileStream); fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("text/plain"); formData.Add(fileContent, "FormFile", Path.GetFileName(filePath)); var response = await httpClient.PostAsync(apiUrl, formData); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); System.Console.WriteLine("上传结果:" + result); } } } }
内容的提问来源于stack exchange,提问作者Somashekhar
相关产品推荐
相关产品推荐

