使用RegularExpressionValidator验证asp:UploadFile文件名时出现问题

时间:2009-07-28 18:05:53

标签: asp.net regex file-upload case-insensitive file-type

我在设置文件中有一行我想要允许的所有文件类型:

jpeg|jpg|tiff|tif|png|gif|bmp|eps|wmf|emf|pdf|doc|docx|zip|rar|ppt|pptx|mdb|xls

我希望FileUpload控件旁边有一个只允许这些文件的RegularExpressionValidator。

我在PageLoad事件中设置regex验证器的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 +")$";
    }
}

但它区分大小写。 我现在唯一的问题是让它变得不敏感。

5 个答案:

答案 0 :(得分:0)

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 +")$";
    }
}

答案 1 :(得分:0)

如果关闭客户端验证并仅使用服务器端验证,则可以使用.NET支持案例insensitivte operatior(?i)。如果你想要一些同时适用于客户端和服务器端的东西,你可能需要诉诸类似

的东西

[Jj] [Pp] [Ee] [Gg]

每个文件扩展名。没有包含每个扩展程序的代码,应该很容易推断出模式

答案 2 :(得分:0)

答案:

^.*\.(?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);

这应该是针对动态可变列表验证文件的一种非常有效的方法

仅供参考,我使用this在线正则表达式构建器,这是一个了不起的免费工具!

答案 3 :(得分:0)

正则表达式与服务器端的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>

答案 4 :(得分:0)

如果您使用.NET进行此验证服务器端,则可以使用类似

的内容

VB:

    Dim re As New Regex("(jpg)|(gif)", RegexOptions.IgnoreCase)
    re.IsMatch("image.jpg")

C#:

    var re = new Regex("(jpg)|(gif)", RegexOptions.IgnoreCase);
    re.IsMatch("image.jpg")