我正在使用ASP.NET核心2.2和我正在使用模型绑定上传文件。
这是我的用户视图模型
public class UserViewModel
{
[Required(ErrorMessage = "Please select a file.")]
[DataType(DataType.Upload)]
public IFormFile Photo { get; set; }
}
这是我的视图
@model UserViewModel
<form method="post"
asp-action="UploadPhoto"
asp-controller="TestFileUpload"
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> UploadPhoto(UserViewModel userViewModel)
{
if (ModelState.IsValid)
{
var formFile = userViewModel.Photo;
if (formFile == null || formFile.Length == 0)
{
ModelState.AddModelError("", "Uploaded file is empty or null.");
return View(viewName: "Index");
}
var uploadsRootFolder = Path.Combine(_environment.WebRootPath, "uploads");
if (!Directory.Exists(uploadsRootFolder))
{
Directory.CreateDirectory(uploadsRootFolder);
}
var filePath = Path.Combine(uploadsRootFolder, formFile.FileName);
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(fileStream).ConfigureAwait(false);
}
RedirectToAction("Index");
}
return View(viewName: "Index");
}
如何限制上传的文件大小在5MB以内,并且有特定的扩展名,比如.jpeg和.png?我认为这两个验证都是在ViewModel中完成的,但是我不知道如何做到这一点。
6条答案
按热度按时间6psbrbz91#
您可以自定义验证属性
MaxFileSizeAttribute
,如下所示最大文件大小属性
允许的扩展名属性
将
MaxFileSize
属性和AllowedExtensions
属性添加到Photo
属性rnmwe5a22#
这就是我使用自定义验证属性的方式,几乎与@xueli-chen的答案相同,但可以用于生产。
第一个月
FileSizeAttribute
现在你可以使用任何内置的验证属性,包括自定义/本地化的错误消息、最大-最小文件大小和文件扩展名。
vsikbqxv3#
您可以实现
IValidatableObject
来验证您的模型。jjjwad0x4#
以上的解决方案是通过扩展名来验证文件(实际上只是文件名)。这是不安全的,因为它允许加载可执行文件(假装是图像或其他)。
您应该将文件的 * 签名 * 与预定义的允许签名列表进行比较。请参阅MS文档中的文件签名验证部分。
然后从控制器调用
IsFileValid()
方法。更多签名可在Wikipedia上找到。
koaltpgm5#
在previous comment之后,可以添加此类:
最后,将过滤器添加到Startup类中的控制器:
3htmauhk6#
在.Net 5上测试。使用自定义
object
(您可以使用自己的ActionResult类)获得更灵活的属性如何?并在控制器中使用: