Проблема с проверкой имен файлов asp:UploadFile с помощью RegularExpressionValidator
-
20-09-2019 - |
Вопрос
У меня в файле настроек есть ряд всех типов файлов, которые я хочу разрешить:
jpeg|jpg|tiff|tif|png|gif|bmp|eps|wmf|emf|pdf|doc|docx|zip|rar|ppt|pptx|mdb|xls
Я хочу иметь рядом с элементом управления FileUpload RegularExpressionValidator, который разрешает использовать только эти файлы.
Я обрабатываю это в событии PageLoad, устанавливая свойство ValidationExpression валидатора регулярных выражений.
Я пытался:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string regex = "jpeg|jpg|tiff"; //A huge list of filetypes.
upFiles_RegularExpressionValidator.ValidationExpression =
@"^.*\.(" + regex +")$";
}
}
Но это чувствительно к регистру.Моя единственная проблема сейчас — сделать его нечувствительным.
Решение
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string regex = "([jJ][pP][eE][gG])|([jJ][pP][gG])|([tT][iI][fF][fF])"; //A huge list of filetypes.
upFiles_RegularExpressionValidator.ValidationExpression =
@"^.*\.(" + regex +")$";
}
}
Другие советы
Если вы отключите проверку на стороне клиента и используете только проверку на стороне сервера, можно использовать оператор, нечувствительный к регистру поддержки .NET (?i).Если вам нужно что-то, что работает как на стороне клиента, так и на стороне сервера, вам может потребоваться прибегнуть к чему-то вроде
[Jj][Pp][Ee][Gg]
для каждого из ваших расширений файлов.Не включен код для каждого из ваших расширений, экстраполировать шаблон должно быть довольно легко.
Отвечать:
^.*\.(?i-s:pdf|exe)$
Что значит:
ValidationExpression = @"^.*\.(?i-s:pdf|exe)$"; //will match pdf PDF exe EXE
string regex = "jpeg|jpg|tiff|tif|png|gif|bmp|eps";
ValidationExpression = @"^.*\.(?i-s:file_types)$".Replace("file_types", regex);
Это должен быть очень эффективный способ проверки файлов на соответствие динамическому изменяемому списку.
К вашему сведению, я сделал это с этот онлайн-конструктор регулярных выражений — потрясающий бесплатный инструмент!
Регулярное выражение отлично работает с RegularExpressionValidator на стороне сервера.Проблема возникает, когда он пытается выполнить проверку клиента, которая терпит неудачу, потому что вариант регулярного выражения javascript не знает, как обрабатывать «?i» (нечувствительность к регистру достигается в регулярном выражении javascript с «i»).Вы можете решить эту проблему, добавив этот скрипт на свои страницы.Я думаю, что сценарий довольно прост.
<script type="text/javascript" language="javascript">
function RegularExpressionValidatorEvaluateIsValid(val)
{
var value = ValidatorGetValue(val.controltovalidate);
if (ValidatorTrim(value).length == 0)
return true;
var regex = null;
if(val.validationexpression.indexOf("(?i)")>=0)
{
regex = new RegExp(val.validationexpression.replace("(?i)",""),"i");
}
else
{
regex = new RegExp(val.validationexpression);
}
var matches = regex.exec(value);
return (matches != null && value == matches[0]);
}
</script>
Если вы выполняете эту проверку на стороне сервера с помощью .NET, вы можете использовать что-то вроде
ВБ:
Dim re As New Regex("(jpg)|(gif)", RegexOptions.IgnoreCase)
re.IsMatch("image.jpg")
С#:
var re = new Regex("(jpg)|(gif)", RegexOptions.IgnoreCase);
re.IsMatch("image.jpg")