You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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ş

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:27:21