Проблема с проверкой типов файлов в элементе управления ASP.NET FileUpload с помощью RegularExpressionValidator - PullRequest
2 голосов
/ 03 июня 2009

код:

<span>Upload Adobe Acrobat file<img src="../../Images/UI/pdf.jpg" style="height: 25;
    width: 20" height="25" width="20" /></span>
<asp:FileUpload ID="uplPdf" runat="server" />
<asp:RegularExpressionValidator ID="valPdf" runat="server" ErrorMessage="Only PDF files are allowed!"
    ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$" Display="Dynamic"
    ControlToValidate="uplPdf" ValidationGroup="upload" />
<br />
<asp:Button ID="btnUpload" runat="server" Text="Upload files" OnClick="btnUpload_Click"
    ValidationGroup="upload" />

код позади:

if (valPdf.IsValid && uplPdf.HasFile)

IsValid возвращает false после ввода правильного имени файла pdf. Обратите внимание, что если файл не указан, возвращает true.

Ответы [ 4 ]

2 голосов
/ 03 июня 2009

Попробуйте это в вашем RegularExpressionValidator

<asp:RegularExpressionValidator ID="valPdf" runat="server" 
  ErrorMessage="Only PDF files are allowed!" 
  ValidationExpression=".+.(P|p)(D|d)(F|f)$" 
   Display="Dynamic" ControlToValidate="uplPdf" ValidationGroup="upload" />

Затем в своем коде, позвоните Page.Validate ("upload") , прежде чем продолжить:

Page.Validate("upload");
if(valPdf.IsValid && uplPdf.HasFile)
{
   //Proceed with the upload
}

ПРИМЕЧАНИЕ: Вышеприведенное выражение ValidationExpression будет соответствовать любым файлам, заканчивающимся * .pdf, без учета регистра. Поэтому "c:\somepath\somefile.pdF", "somefile.pDF" и "somefile.Pdf" все пройдут проверку.

0 голосов
/ 28 августа 2009

Я добавил список файлов в коллекцию строк в настройках проекта.

Затем я установил регулярное выражение:

public static string PrepareValidExtensionRegex(string[] allowedFileTypes)
{
    for (int i = 0; i < allowedFileTypes.Length; i++)
    {
        char[] chars = allowedFileTypes[i].ToCharArray();
        int length = chars.Length;
        string[] ret = new string[length];
        for (int j = 0; j < length; j++)
        {
            char ch = chars[j];
            char replacement = char.IsLower(ch)?
                               char.ToUpper(ch): 
                               char.ToLower(ch);
            ret[j] = "[" + ch + replacement + ']';
        }
        allowedFileTypes[i] = '(' + string.Join("", ret) + ')';
    }

    return @"^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(" + 
        string.Join("|", allowedFileTypes) + ")$";
}

//Usage:
string[] allowedFiles = new string[] { "jpg", "gif" };
RegexValidator.ValidationExpression = PrepareValidationExpression(allowedFiles);
0 голосов
/ 03 июня 2009

Ну да, обычно вы должны были бы избежать точки.

Кроме того, в вопросе используется функция регулярного выражения POSIX, в то время как обычно мы используем Perl Styled Expressions в .NET

Вы пробовали что-то вроде:

\.pdf$

И, конечно же, убедитесь, что он игнорирует регистр букв.

0 голосов
/ 03 июня 2009

Ну ... я не думаю, что это регулярное выражение когда-нибудь сработает в этом случае. Попробуйте это:

ValidationExpression = "^. +. PDF $"

это должно работать для файлов, заканчивающихся на .pdf, что вам и нужно.

...