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

如何在Postman的JSON [FromBody]中指定文件路径?ASP.NET Core API空值问题

为什么你的IFormFile获取为空?以及正确的文件上传方式

首先直接给结论:你不能通过在JSON请求体里传递本地文件路径的方式,让ASP.NET Core Web API接收到有效的IFormFile,原因主要有两个:

  1. 请求格式不匹配:IFormFile是ASP.NET Core专门为multipart/form-data类型的请求设计的,用来解析表单中的文件上传字段。而你发送的是JSON格式(application/json)的请求,服务器端不会把字符串形式的文件路径自动转换成IFormFile对象,自然就会为空。
  2. 安全限制:服务器根本无法访问客户端的本地文件系统——你传的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:值填1
    • Name:值填Shekhar
    • FormFile:类型选择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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:47:33