ASP.NET Core 用 IFormFile 接收图片需控制器参数为 IFormFile 类型、表单设 enctype="multipart/form-data",并校验文件头、大小、扩展名,安全命名后存至 wwwroot 或配置静态文件服务。
IFormFile 接收上传的图片核心是后端控制器里接收 IFormFile 类型参数,不是直接读取 Request.Form 或尝试解析 raw body。MVC 框架会自动绑定 multipart/form-data 请求中的文件字段。
常见错误:把参数写成 string file 或 byte[] file,结果始终为 null;或漏掉前端表单的 enctype="multipart/form-data",导致文件根本没发过来。
POST,且参数类型为 IFormFile(单文件)或 IList(多文件)Startup.cs 或 Program.cs 中已调用 services.AddControllersWithViews()(默认已启用文件绑定)appsettings.json 中配置 Kestrel 的请求体大小限制,例如:"Kestrel": {
"Limits": {
"MaxRequestBodySize": 104857600
}
}不能只靠前端 做校验——它可被绕过。后端必须检查文件头(magic number)和扩展名是否匹配,否则可能传入伪装成 JPG 的 WebShell。
关键点:别用 Path.GetExtension(file.FileName) 判断类型,攻击者可改后缀;要用 file.ContentType 结合二进制头校验
。
file.ContentType 可能被伪造,仅作参考;必须读取前几个字节比对,如 JPG 是 0xFF, 0xD8,PNG 是 0x89, 0x50, 0x4E, 0x47
file.Length 限制大小(比如 ≤5MB),避免内存爆满Path.GetRandomFileName() + 固定扩展名(如 .jpg),不要保留原始 file.FileName
直接存到 wwwroot/images/ 最简单,但要注意权限和清理问题;存到外部路径(如 D:\uploads\)则需额外配置静态文件中间件映射访问路径。
容易踩的坑:用 Directory.GetCurrentDirectory() 拼路径,结果保存到了 bin/Debug 下,而非项目根目录;或者忘了在 Program.cs 中调用 app.UseStaticFiles() 导致图片 URL 404。
IWebHostEnvironment.WebRootPath 获取 wwwroot 物理路径Directory.CreateDirectory(uploadPath)
wwwroot,需手动添加静态文件服务:app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(@"D:\uploads"),
RequestPath = "/uploads"
});前端 JS 通常用 fetch 或 axios 上传,后端返回结构化 JSON(如 { success: true, url: "/images/abc.jpg" }),而不是重定向或视图。
常见疏漏:没设 CORS 头导致跨域失败;或上传失败时返回 500 却没给具体错误信息,前端只能显示“上传失败”。
Ok(new { success = true, url = $"/images/{savedName}" }) 或 BadRequest(new { error = "不支持的图片格式" })
contentType: false 和 processData: false 必须设为 false,否则 FormData 被破坏Content-Type 和 X-Requested-With 等上传所需 header