Проблема с проверкой имен файлов asp:UploadFile с помощью RegularExpressionValidator

StackOverflow https://stackoverflow.com/questions/1195739

Вопрос

У меня в файле настроек есть ряд всех типов файлов, которые я хочу разрешить:

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")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top