跳转到主内容
极星编程网:以代码为星,赴技术山海!

c# 如何实现图片上传功能

ASP.NET Core 用 IFormFile 接收图片需控制器参数为 IFormFile 类型、表单设 enctype="multipart/form-data",并校验文件头、大小、扩展名,安全命名后存至 wwwroot 或配置静态文件服务。 ASP.NET Core 中用
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 或独立存储目录 直接存到
wwwroot/images/
最简单,但要注意权限和清理问题;存到外部路径(如
D:\uploads\
)则需额外配置静态文件中间件映射访问路径。 php版微信js-sdk支付接口类 php版微信js-sdk支付接口类 下载 容易踩的坑:用
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 = "http://www.jxgpc.com/uploads" });
返回 JSON 响应并处理前端错误 前端 JS 通常用
fetch
或
axios
上传,后端返回结构化 JSON(如
{ success: true, url: "/images/abc.jpg" }
),而不是重定向或视图。 常见疏漏:没设 CORS 头导致 跨域 失败;或上传失败时返回 500 却没给具体错误信息,前端只能显示“上传失败”。 统一返回
Ok(new { success = true, url = $"/images/{savedName}" })
或
BadRequest(new { error = "不支持的图片格式" })
若用 jQuery,注意
contentType: false
和
processData: false
必须设为
false
,否则 FormData 被破坏 CORS 配置要允许
Content-Type
和
X-Requested-With
等上传所需 header 图片上传真正麻烦的不是“怎么存”,而是“怎么防住恶意输入、超大文件、路径遍历、并发冲突”。每一步校验都得落在实处,少一个就可能变成漏洞入口。

相关文章