e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
80 lines
2.9 KiB
C#
80 lines
2.9 KiB
C#
using System.Diagnostics.CodeAnalysis;
|
|
namespace System.ComponentModel.DataAnnotations {
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.ComponentModel.DataAnnotations.Resources;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Linq;
|
|
|
|
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
|
|
public sealed class FileExtensionsAttribute : DataTypeAttribute {
|
|
private string _extensions;
|
|
|
|
public FileExtensionsAttribute()
|
|
: base(DataType.Upload) {
|
|
|
|
// DevDiv 468241: set DefaultErrorMessage not ErrorMessage, allowing user to set
|
|
// ErrorMessageResourceType and ErrorMessageResourceName to use localized messages.
|
|
DefaultErrorMessage = DataAnnotationsResources.FileExtensionsAttribute_Invalid;
|
|
}
|
|
|
|
public string Extensions {
|
|
get {
|
|
// Default file extensions match those from jquery validate.
|
|
return String.IsNullOrWhiteSpace(_extensions) ? "png,jpg,jpeg,gif" : _extensions;
|
|
}
|
|
set {
|
|
_extensions = value;
|
|
}
|
|
}
|
|
|
|
private string ExtensionsFormatted {
|
|
get {
|
|
return ExtensionsParsed.Aggregate((left, right) => left + ", " + right);
|
|
}
|
|
}
|
|
|
|
[SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase", Justification = "These strings are normalized to lowercase because they are presented to the user in lowercase format")]
|
|
private string ExtensionsNormalized {
|
|
get {
|
|
return Extensions.Replace(" ", "").Replace(".", "").ToLowerInvariant();
|
|
}
|
|
}
|
|
|
|
private IEnumerable<string> ExtensionsParsed {
|
|
get {
|
|
return ExtensionsNormalized.Split(',').Select(e => "." + e);
|
|
}
|
|
}
|
|
|
|
public override string FormatErrorMessage(string name) {
|
|
return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, ExtensionsFormatted);
|
|
}
|
|
|
|
public override bool IsValid(object value) {
|
|
if (value == null) {
|
|
return true;
|
|
}
|
|
|
|
string valueAsString = value as string;
|
|
if (valueAsString != null) {
|
|
return ValidateExtension(valueAsString);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
[SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase", Justification = "These strings are normalized to lowercase because they are presented to the user in lowercase format")]
|
|
private bool ValidateExtension(string fileName) {
|
|
try {
|
|
return ExtensionsParsed.Contains(Path.GetExtension(fileName).ToLowerInvariant());
|
|
}
|
|
catch (ArgumentException) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|