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

ASP.NET Core 6 Web API图片上传:IFormFile转JSON报400错误求助

解决ASP.NET Core 6 Web API中IFormFile无法通过JSON转换的400错误

问题根源

你遇到的The JSON value could not be converted to Microsoft.AspNetCore.Http.IFormFile错误,本质是IFormFile设计用于处理multipart/form-data格式的文件上传,而非JSON格式。JSON无法序列化/反序列化文件流类型,用[FromBody]接收JSON时必然触发转换失败。

解决方案步骤

1. 修正控制器参数的接收特性

把SignUp方法的[FromBody]替换为[FromForm],让ASP.NET Core正确解析表单中的文本字段和文件:

[HttpPost("signUp")]
public async Task<ActionResult<User>> SignUp([FromForm] UserViewModel model)
{
    // 原有业务逻辑保持不变
}

2. 补全UserViewModel类定义

你的代码中UserViewModel缺少类声明,补上完整定义:

public class UserViewModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Required(ErrorMessage = "Full Name is a required field")]
    public string FullName { get; set; } = null!;
    [Required(ErrorMessage = "Email Name is a required field"), EmailAddress]
    public string Email { get; set; } = null!;
    [Required(ErrorMessage = "User Name is a required field")]
    public string UserName { get; set; } = null!;
    [Required(ErrorMessage = "Password is a required field")]
    public string Password { get; set; } = null!;
    public IFormFile? Photo { get; set; }
}

3. 调整前端请求格式

前端必须发送multipart/form-data类型的请求,而非JSON:

  • Postman操作:选择form-data类型,依次添加文本字段(FullName、Email、UserName、Password),再添加Photo字段并选择本地文件。
  • JavaScript示例:
const formData = new FormData();
formData.append('FullName', 'John Doe');
formData.append('Email', 'john@example.com');
formData.append('UserName', 'johndoe');
formData.append('Password', 'P@ssw0rd');
formData.append('Photo', document.getElementById('fileInput').files[0]);

fetch('/api/Register/signUp', {
  method: 'POST',
  body: formData
});

4. 上传方法优化(可选)

确保上传目录存在,避免因文件夹缺失报错:

private string UploadedFile(UserViewModel model)
{
    string uniqueFileName = null!;

    if (model.Photo != null)
    {
        string uploadsFolder = Path.Combine(_environment.WebRootPath, "Images");
        // 检测目录,不存在则创建
        if (!Directory.Exists(uploadsFolder))
        {
            Directory.CreateDirectory(uploadsFolder);
        }
        uniqueFileName = Guid.NewGuid().ToString() + "_" + model.Photo.FileName;
        string filePath = Path.Combine(uploadsFolder, uniqueFileName);

        using var fileStream = new FileStream(filePath, FileMode.Create);
        model.Photo.CopyTo(fileStream);
    }

    return uniqueFileName;
}

内容的提问来源于stack exchange,提问作者Opal David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:48:22