ASP.NET Core Web API接收multipart/form-data文件需用IFormFile参数并确保前后端key名一致;须配置Kestrel、FormOptions及反向代理的上传限制;保存时禁用原始文件名、异步写入并确保目录可写;返回uploadId供前端轮询进度。
ASP.NET Core Web API如何接收 multipart/form-data 文件
ASP.NET Core 默认能解析 multipart/form-data 请求,但必须显式启用模型绑定支持——否则 IFormFile 参数会为 null 或抛出 400 错误。关键不是“能不能”,而是“有没有配对的接收方式”。
- 控制器方法参数必须是
IFormFile(单文件)或IFormFileCollection(多文件),不能用Stream或byte[]直接绑定 -
前端
FormData的 key 名必须和 Action 参数名完全一致,例如form.append("file", input.files[0])→ 后端用IFormFile file - 若使用
[FromForm],只在复杂模型中需要;单个IFormFile参数可省略该特性 - .NET 6+ 默认允许最大 128 MB 文件,超出需配置
MaxRequestBodySize和FormOptions.ValueLengthLimit
如何配置大文件上传限制(避免 413 Payload Too Large)
默认限制太小,上传几十 MB 就失败。错误信息通常是 HTTP Error 413.13 - Payload Too Large 或日志里出现 Request body too large。这不是代码写错了,是没调服务层阈值。
- 在
Program.cs中调用builder.Services.Configure设置Limits.MaxRequestBodySize(单位字节) - 同时调用
builder.Services.Configure设置ValueLengthLimit和MultipartBodyLengthLimit(后者影响整个 multipart 总大小) - 若部署在 IIS,还需在
web.config添加(单位字节) - 注意:Kestrel 配置仅对 Kestrel 生效;反向代理(如 Nginx)也有自己的 client_max_body_size 限制,必须同步调整
IFormFile.CopyToAsync() 保存文件时要注意什么
直接调用 CopyToAsync() 看似简单,但容易忽略路径安全、并发冲突和磁盘权限问题。