【问题标题】:How to validate uploaded files in ASP.Net MVC如何在 ASP.Net MVC 中验证上传的文件
【发布时间】:2020-07-04 09:24:57
【问题描述】:

我有一个很好的答案 here 来验证仅 1 个单个文件的文件扩展名和文件大小。

但是如何验证“List ImagesFile”的文件扩展名和文件大小?

【问题讨论】:

  • 如何将 IFormFile 更改为 List。他们进行验证只是在列表上循环并一一验证。
  • 你想到了什么样的验证?

标签: c# asp.net asp.net-mvc asp.net-core


【解决方案1】:

第一种方式是使用IValidatableObject

public class UserViewModel : IValidatableObject
{
    public IList<IFormFile> Photo { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var photos = ((UserViewModel)validationContext.ObjectInstance).Photo;
        foreach(var photo in photos)
        {
            var extension = Path.GetExtension(photo.FileName);
            var size = photo.Length;

            if (!extension.ToLower().Equals(".jpg")||! extension.ToLower().Equals(".png"))
                yield return new ValidationResult($"{photo.FileName}'s file extension is not valid.");

            if (size > (5 * 1024 * 1024))
                yield return new ValidationResult($"{photo.FileName}'s file size is bigger than 5MB.");
        }
        
    }
}

结果:

第二种方式是自定义验证属性:

最大文件大小属性:

public class MaxFileSizeAttribute : ValidationAttribute
{
    private readonly int _maxFileSize;
    public MaxFileSizeAttribute(int maxFileSize)
    {
        _maxFileSize = maxFileSize;
    }

    protected override ValidationResult IsValid(
    object value, ValidationContext validationContext)
    {
        var files = value as IList<IFormFile>;
        foreach(var file in files)
        {
            if (file != null)
            {
                if (file.Length > _maxFileSize)
                {
                    return new ValidationResult(GetErrorMessage(file.FileName));
                }
            }
        }    
        

        return ValidationResult.Success;
    }

    public string GetErrorMessage(string name)
    {
        return $"{name}'s size is out of range.Maximum allowed file size is { _maxFileSize} bytes.";
    }
}

AllowedExtensionsAttribute:

public class AllowedExtensionsAttribute : ValidationAttribute
{
    private readonly string[] _extensions;
    public AllowedExtensionsAttribute(string[] extensions)
    {
        _extensions = extensions;
    }

    protected override ValidationResult IsValid(
    object value, ValidationContext validationContext)
    {
        var files = value as IList<IFormFile>;
        foreach(var file in files)
        {
            var extension = Path.GetExtension(file.FileName);
            if (file != null)
            {
                if (!_extensions.Contains(extension.ToLower()))
                {
                    return new ValidationResult(GetErrorMessage(file.FileName));
                }
            }
        }
        
        return ValidationResult.Success;
    }

    public string GetErrorMessage(string name)
    {
        return $"{name} extension is not allowed!";
    }
}

型号:

public class UserViewModel
{
    [MaxFileSize(5 * 1024 * 1024)]
    [AllowedExtensions(new string[] { ".jpg",".png"})]
    public IList<IFormFile> Photo { get; set; }
}

查看(上传.cshtml):

@model UserViewModel

<form method="post"
        asp-action="Upload"
        asp-controller="Home"
        enctype="multipart/form-data">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

    <input asp-for="Photo" />
    <span asp-validation-for="Photo" class="text-danger"></span>
    <input type="submit" value="Upload" />
</form>

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Upload(UserViewModel userViewModel)
{
    if (!ModelState.IsValid)
    {                
        return View("Upload");
    }
    return View("Index");
}

【讨论】:

    【解决方案2】:

    您可以在模型中使用 IEnumerable HttpPostedFileBase,然后在控制器上对其进行验证。您可以在以下链接中找到示例代码:

    Multiple File Upload in asp.net mvc

    如果你想在你的模型上使用 DataAnnotation,那么我建议你也看看另一个链接,它提供了关于使用 DataAnnotation 进行自定义验证的信息

    ASP.NET MVC: Custom Validation by DataAnnotation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-28
      • 2012-08-28
      • 2010-12-27
      • 2012-10-30
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多