用途:在 ASP.NET Core Minimal API(.NET 8+)中实现文件上传端点,处理 IFormFile 或 IFormFileCollection 参数,并配置大小限制、内容类型校验与流式上传。
主要能力与用法:
- 绑定:.NET 8+ 中 IFormFile 作为唯一复杂参数时自动从 multipart/form-data 绑定;与其它表单字段混用时,需对所有表单参数加 [FromForm](或合并为单个 [FromForm] DTO)。多文件用 IFormFileCollection。
- 大小限制:需同时配置两处——Kestrel 的 MaxRequestBodySize(默认 30MB)与 FormOptions.MultipartBodyLengthLimit(默认 128MB),只改一处会导致上传失败。可用 [RequestSizeLimit] 按端点覆盖,或用 [DisableRequestSizeLimit] 关闭限制。
- 防伪:.NET 8+ 启用 UseAntiforgery() 后,所有表单绑定端点(含文件上传)自动校验防伪令牌,缺失返回 400。纯 API 端点可用 .DisableAntiforgery() 显式退出;对使用 Cookie 认证的端点禁用会移除 CSRF 防护,应改为携带有效令牌。
- 内容校验:不能只信任扩展名或 Content-Type,需检查魔数字节(如 JPEG 为 FF D8 FF,PNG 为 89 50 4E 47),并让声明的 Content-Type 与检测结果一致。保存路径不得直接使用用户文件名(存在路径穿越风险),应生成 Guid 文件名,扩展名由校验后的内容推导。
- 流式上传:IFormFile 会缓冲内容(超过阈值落盘临时文件),超大文件建议用 MultipartReader 逐段读取并直接写入存储,配合 [DisableRequestSizeLimit]。
适用场景:需要文件上传的 Minimal API 服务,尤其是需控制大小、校验类型或处理大文件的场景。
限制:不适用于 MVC 控制器(可直接用 [FromForm] IFormFile)、纯 JSON 请求,以及超过 1GB 的文件(应改用 MultipartReader 流式处理)。