Would be great if this included attributes for MaxFileSize and AllowedFileExtensions. Maybe my code for Umbraco v8 helps to get started. Haven't had time to port these to v9 yet.
(UmbracoValidationHelper was just a static class to help fetch dictionary items from cache)
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web;
using System.Web.Mvc;
namespace Application.Core.ValidationAttributes
{
public class UmbracoMaxFileSize : ValidationAttribute, IClientValidatable
{
private readonly string _errorMessageDictionaryKey;
private readonly int _maxFileSize;
public UmbracoMaxFileSize(string errorMessageDictionaryKey, int maxFileSize)
{
_errorMessageDictionaryKey = errorMessageDictionaryKey;
_maxFileSize = maxFileSize;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var file = value as HttpPostedFileBase;
if (file != null)
{
if (file.ContentLength > _maxFileSize)
{
//Get the error message to return
var error = UmbracoValidationHelper.FormatErrorMessage(_errorMessageDictionaryKey, GetMaxFileSizeInMB());
//Return error
return new ValidationResult(error);
}
}
return ValidationResult.Success;
}
private string GetMaxFileSizeInMB()
{
return (_maxFileSize % 1048576M == 0) ? (_maxFileSize / 1048576).ToString() : Math.Round(_maxFileSize / 1048576M, 3).ToString();
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
ErrorMessage = UmbracoValidationHelper.GetDictionaryItem(_errorMessageDictionaryKey);
var rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(GetMaxFileSizeInMB());
rule.ValidationType = "filesize";
rule.ValidationParameters.Add("maxsize", _maxFileSize);
yield return rule;
}
}
}
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Application.Core.ValidationAttributes
{
public class UmbracoHttpPostedFileExtensions : ValidationAttribute, IClientValidatable
{
private readonly string _errorMessageDictionaryKey;
private readonly string _fileExtensions;
private readonly string _fileExtensionsDescription;
public UmbracoHttpPostedFileExtensions(string errorMessageDictionaryKey, string fileExtensions, string fileExtensionsDescription)
{
_errorMessageDictionaryKey = errorMessageDictionaryKey;
_fileExtensions = fileExtensions;
_fileExtensionsDescription = fileExtensionsDescription;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var file = value as HttpPostedFileBase;
if (file != null)
{
var fileName = file.FileName;
var isValidExtension = _fileExtensions.ToLower().Split(',').Any(e => fileName.EndsWith(e));
if (!isValidExtension)
{
//Get the error message to return
var error = UmbracoValidationHelper.FormatErrorMessage(_errorMessageDictionaryKey, _fileExtensionsDescription);
//Return error
return new ValidationResult(error);
}
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
ErrorMessage = UmbracoValidationHelper.GetDictionaryItem(_errorMessageDictionaryKey);
var error = FormatErrorMessage(_fileExtensionsDescription);
var rule = new ModelClientValidationRule();
rule.ErrorMessage = error;
rule.ValidationType = "fileextensions";
rule.ValidationParameters.Add("fileextensions", string.Join(",", _fileExtensions));
yield return rule;
}
}
}