0

0

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

煙雲

煙雲

发布时间:2026-01-08 10:15:56

|

692人浏览过

|

来源于php中文网

原创

ASP.NET Core 用 IFormFile 接收图片需控制器参数为 IFormFile 类型、表单设 enctype="multipart/form-data",并校验文件头、大小、扩展名,安全命名后存至 wwwroot 或配置静态文件服务。

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

ASP.NET Core 中用 IFormFile 接收上传的图片

核心是后端控制器里接收 IFormFile 类型参数,不是直接读取 Request.Form 或尝试解析 raw body。MVC 框架会自动绑定 multipart/form-data 请求中的文件字段。

常见错误:把参数写成 string filebyte[] file,结果始终为 null;或漏掉前端表单的 enctype="multipart/form-data",导致文件根本没发过来。

  • 控制器方法必须是 POST,且参数类型为 IFormFile(单文件)或 IList(多文件)
  • 确保 Startup.csProgram.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\)则需额外配置静态文件中间件映射访问路径。

I-Shop购物系统
I-Shop购物系统

部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/

下载

容易踩的坑:用 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"
    });

返回 JSON 响应并处理前端错误

前端 JS 通常用 fetchaxios 上传,后端返回结构化 JSON(如 { success: true, url: "/images/abc.jpg" }),而不是重定向或视图。

常见疏漏:没设 CORS 头导致跨域失败;或上传失败时返回 500 却没给具体错误信息,前端只能显示“上传失败”。

  • 统一返回 Ok(new { success = true, url = $"/images/{savedName}" })BadRequest(new { error = "不支持的图片格式" })
  • 若用 jQuery,注意 contentType: falseprocessData: false 必须设为 false,否则 FormData 被破坏
  • CORS 配置要允许 Content-TypeX-Requested-With 等上传所需 header
图片上传真正麻烦的不是“怎么存”,而是“怎么防住恶意输入、超大文件、路径遍历、并发冲突”。每一步校验都得落在实处,少一个就可能变成漏洞入口。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

176

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

406

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

531

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

150

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

2

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
jQuery 教程
jQuery 教程

共42课时 | 4万人学习

HTML+CSS基础与实战
HTML+CSS基础与实战

共132课时 | 9.4万人学习

tp6+adminlte搭建通用后台
tp6+adminlte搭建通用后台

共39课时 | 5.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号