c# - 如何在 ASP.Net MVC 中验证上传的文件
解决方案
第一种方法是使用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.";
}
}
AllowedExtensions 属性:
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");
}
推荐阅读
- python-3.x - 如何在 Python 中加快人脸识别速度?
- mysql - 如何获取单个整数/浮点列的总和达到某个值的行
- c++ - 从c ++ 17中的文件中读取行
- jquery - 如何将光标聚焦在评论框中的第一行?
- streaming - 何时在黑暗中使用轮询和流式传输
- mongodb - 什么是稀疏?MongoDB中稀疏的目的是什么?
- python - 使用 XPath 和 Scrapy 从下一个节点的子节点中提取文本
- python - selenium with IE:点击按钮下载文件,再点击其他按钮,进程会卡住
- python - 如何验证来自原始 HTML 表单的发布请求(未使用 django 表单)
- java - 使用正则表达式屏蔽以下格式