asp.net core 中需用 iformfilecollection 接收多个文件,而非 iformfile;前端 name 须与后端参数名一致;需同步配置 kestrel、formoptions 和 iis 的请求大小限制;保存时应校验空文件、防范路径遍历、生成唯一文件名。

ASP.NET Core 中用 IFormFileCollection 接收多个文件
ASP.NET Core 默认支持一次上传多个文件,关键不是改前端,而是后端用对类型。如果你在 Controller 方法里写 IFormFile,那只能拿到第一个文件;必须用 IFormFileCollection 才能拿到全部。
常见错误是前端用了 name="files",后端却还写 IFormFile files,结果只收到一个,还容易报模型绑定失败。
- 前端
<input type="file" name="files" multiple>是标准写法,name 保持一致 - 后端 Action 参数必须是
IFormFileCollection files,不能是数组或 List - 如果用
[FromForm]显式标注,要确保整个模型没混用[FromBody] - 单个文件大小默认限制 128KB,多文件总大小默认 128MB,超限会直接 400 或 500,不是进方法再判断
如何配置大文件上传和超时
默认配置下,上传几个 MB 就可能失败,不是代码问题,是 Kestrel 或 IIS 的中间件限制没调。
Startup.cs 或 Program.cs 中必须同步调整三处:
-
ConfigureServices里加services.Configure<kestrelserveroptions>(options => options.Limits.MaxRequestBodySize = 100 * 1024 * 1024);</kestrelserveroptions>(比如 100MB) -
ConfigureServices里加services.Configure<formoptions>(options => { options.MultipartBodyLengthLimit = 100 * 1024 * 1024; });</formoptions> - 如果是 IIS 部署,
web.config里还得加<requestlimits maxallowedcontentlength="104857600"></requestlimits>(单位字节)
漏掉任意一项,上传大文件时都会静默失败或返回 404.13 / 400 错误。
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
保存多个文件时避免路径遍历和重名覆盖
用户传的 file.FileName 是不可信的,直接拼路径会导致目录穿越(比如 ../../web.config),或者同名文件反复覆盖。
- 用
Path.GetFileName(file.FileName)剥离路径部分,只取原始文件名 - 别用原名保存,推荐生成唯一名:
Path.Combine(uploadDir, Guid.NewGuid().ToString("N") + "_" + Path.GetExtension(fileName)) - 检查
file.Length == 0,空文件也要跳过,否则可能创建 0 字节垃圾文件 - 异步保存用
file.CopyToAsync(stream),别用同步CopyTo,否则阻塞线程池
前端提交时带额外字段怎么办
实际业务中,上传文件常要附带 ID、描述等字段,这些和文件一起走 form-data,后端不能只收 IFormFileCollection。
有两种可靠方式:
- 把其他字段也作为参数写在 Action 签名里,如
Upload(IFormFileCollection files, string userId, string remark)—— ASP.NET Core 会自动从 form-data 绑定 - 或者定义一个 ViewModel,属性包含
IFormFileCollection和字符串字段,用[FromForm]接收,但注意:ViewModel 不能有构造函数参数,且所有属性需为 public set
别试图在 HttpContext.Request.Form 里手动取值,冗余且容易漏掉文件流。
多个文件上传本身不难,难的是边界处理:空文件、超限、恶意文件名、并发写入冲突、磁盘满——这些不提前兜住,上线后第一波用户就会触发异常。









