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
相关产品推荐
相关产品推荐

