如何使用FluentValidation校验IFormFile接收文件的图片扩展名
FluentValidation 校验 IFormFile 图片扩展名实现方案
直接在对应上传模型的FluentValidation验证器中编写自定义规则即可,不需要额外引入第三方扩展包,实现逻辑如下:
- 先定义业务允许的图片扩展名白名单,统一存储为小写格式,避免大小写差异导致校验误判。
- 针对
IFormFile类型的属性编写Must校验规则,提取上传文件名的扩展名做白名单匹配。
完整代码示例
首先是接收上传参数的模型:
public class ImageUploadDto { public IFormFile File { get; set; } }
对应校验器实现:
public class ImageUploadDtoValidator : AbstractValidator<ImageUploadDto> { // 可根据业务需求调整允许的图片后缀 private readonly string[] _permittedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp" }; public ImageUploadDtoValidator() { RuleFor(x => x.File) .NotNull().WithMessage("请选择要上传的文件") .Must(HaveValidImageExtension).WithMessage("仅支持上传JPG、PNG、GIF、BMP、WebP格式的图片"); } private bool HaveValidImageExtension(IFormFile file) { if (file == null) return false; var ext = Path.GetExtension(file.FileName)?.ToLowerInvariant(); return !string.IsNullOrWhiteSpace(ext) && _permittedExtensions.Contains(ext); } }
补充注意事项
- 扩展名校验属于接口第一层的合法性校验,生产环境不要只依赖这一层判断,建议后续追加文件头(魔数)校验,防止攻击者将恶意脚本、可执行文件修改后缀后绕过校验上传。
- 如果需要同时限制图片大小,可以在同一条规则下追加判断,比如限制单文件不超过2MB:
RuleFor(x => x.File) .NotNull().WithMessage("请选择要上传的文件") .Must(HaveValidImageExtension).WithMessage("仅支持上传JPG、PNG、GIF、BMP、WebP格式的图片") .Must(file => file.Length <= 2 * 1024 * 1024).WithMessage("图片大小不能超过2MB"); - 提取扩展名后一定要转全小写再做匹配,避免用户上传
.JPG、.Png这类大小写混合后缀的合法图片时被误拦截。
内容的提问来源于stack exchange,提问作者Burcu Taş
相关产品推荐
相关产品推荐

