Problème validation asp: Les noms de fichiers UploadFile avec RegularExpressionValidator
-
20-09-2019 - |
Question
J'ai dans le fichier de paramètres d'une rangée de tous les types de fichiers que je veux permettre à:
jpeg|jpg|tiff|tif|png|gif|bmp|eps|wmf|emf|pdf|doc|docx|zip|rar|ppt|pptx|mdb|xls
Je veux avoir à côté du contrôle FileUpload un RegularExpressionValidator qui permet uniquement ces fichiers.
Je traitais en cas PageLoad définissant la propriété ValidationExpression du validateur regex.
i essayé:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string regex = "jpeg|jpg|tiff"; //A huge list of filetypes.
upFiles_RegularExpressionValidator.ValidationExpression =
@"^.*\.(" + regex +")$";
}
}
Mais il est sensible à la casse. Mon seul problème est maintenant de le rendre insensible.
La solution
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 +")$";
}
}
Autres conseils
Si vous désactivez validion côté client et utiliser uniquement la validation côté serveur, il y a un cas prise en charge .NET insensitivte operatior (? I) qui peut être utilisé. Si vous voulez somethign qui fonctionne à la fois côté client et serveur, vous devrez peut-être recourir à quelque chose comme
[Jj] [Pp] [Ee] [Gg]
pour chacun de vos extensions de fichier. Prévoiraient pas de code pour chacun de vos extensions, devrait être assez facile d'extrapoler le modèle
Réponse:
^.*\.(?i-s:pdf|exe)$
Ce qui signifie:
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);
Cela devrait être un moyen très efficace de la validation des fichiers à une liste modifiable dynamique
Pour votre information, je l'ai fait avec ce constructeur en ligne regex, un outil gratuit étonnant!
Le regex fonctionne très bien avec le RegularExpressionValidator sur le côté serveur. Le problème se lève quand il essaie de faire la validation du client, qui échoue parce que le javascript saveur regex ne sait pas comment gérer « ? I » (la casse est réalisé en javascript regex avec « i »). Vous pouvez résoudre ce problème en ajoutant ce script à vos pages. Je pense que le script est assez simple.
<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>
Si vous faites ce côté serveur de validation avec .NET, vous pouvez utiliser quelque chose comme
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")