ASP.NET上传大量文件时FromForm参数为null的问题及解决
问题原因与解决方案
你遇到的问题是触发了ASP.NET Core的表单键值对数量限制:默认配置下,框架对表单中的键值对总数(ValueCountLimit)和多部分请求的头部数量(MultipartHeadersCountLimit)有默认限制(通常为1000)。当上传2000个文件时,每个文件会在multipart表单中生成多个键值对(比如文件本身、文件名、内容类型等),总数量超过默认限制,导致模型绑定失败,最终files参数变为null。
解决方法
方法1:控制器特性局部配置
直接在控制器方法的RequestFormLimits特性中补充配置相关限制参数,设置足够大的数值以容纳2000个文件的需求:
[RequestSizeLimit(100_000_000_000)] [RequestFormLimits( MultipartBodyLengthLimit = long.MaxValue, ValueLengthLimit = int.MaxValue, ValueCountLimit = 10000, // 根据实际文件数量调整,确保覆盖需求 MultipartHeadersCountLimit = 10000 )] [HttpPost("api/files")] [Authorize(Policy = Perm.FileCreate)] public async Task<IActionResult> CreateAsync([FromForm] CreateFileDto files) { // 业务逻辑代码 }
方法2:全局配置
如果多个接口都有大量文件上传需求,可以在全局配置FormOptions,避免重复设置:
在Program.cs中添加以下配置:
builder.Services.Configure<FormOptions>(options => { // 调整键值对总数限制 options.ValueCountLimit = 10000; // 调整多部分请求头部数量限制 options.MultipartHeadersCountLimit = 10000; // 其他已有的全局限制配置 options.MultipartBodyLengthLimit = long.MaxValue; options.ValueLengthLimit = int.MaxValue; });
注意事项
- 配置的数值需根据实际业务需求调整,避免设置过大带来潜在的安全风险(比如恶意请求攻击)。
- 确保
RequestSizeLimit的数值足够覆盖所有上传文件的总大小,避免触发请求大小限制。
内容的提问来源于stack exchange,提问作者Tor Hovland
相关产品推荐
相关产品推荐

