Asp.net mvc 用于文件名验证的视图模型中的ASP.net MVC正则表达式
我已经阅读了一些回答这个问题的问题,我理解我需要使用的正则表达式,但是在MVC中实际应用它是我遇到的困难。我还将在序言中说,到目前为止,我在正则表达式方面很糟糕 我正在用MVC编写一个文件上传应用程序,我想应用标准的windows文件名验证<代码>\/:*?“|是名称中任何位置的无效字符 我的视图模型是这样设置的,使用不同的正则表达式:Asp.net mvc 用于文件名验证的视图模型中的ASP.net MVC正则表达式,asp.net-mvc,regex,Asp.net Mvc,Regex,我已经阅读了一些回答这个问题的问题,我理解我需要使用的正则表达式,但是在MVC中实际应用它是我遇到的困难。我还将在序言中说,到目前为止,我在正则表达式方面很糟糕 我正在用MVC编写一个文件上传应用程序,我想应用标准的windows文件名验证\/:*?“|是名称中任何位置的无效字符 我的视图模型是这样设置的,使用不同的正则表达式: public class FileRenameModel { [RegularExpression(@"^[\w\-. ]+$", ErrorMessa
public class FileRenameModel
{
[RegularExpression(@"^[\w\-. ]+$", ErrorMessage="A filename cannot contain \\ / : * ? \" < > |")]
[Required]
public string Filename { get; set; }
[Required]
public int FileID { get; set; }
}
公共类文件重命名模型
{
[正则表达式(@“^[\w\-.]+$”,ErrorMessage=“文件名不能包含\\/:*?\”<>”)
[必需]
公共字符串文件名{get;set;}
[必需]
public int FileID{get;set;}
}
每当我试图将正则表达式改为<代码> >“^ [\/],] + $< /代码>时,“在中间杀死它并引发错误。我还没弄清楚如何正确地将它包含在字符串中。当我使用正则表达式时,”它告诉我,任何放入文本框的字符串都失败了。我是否错误地使用了^
在使用@
启动字符串后,使用double“
转义引号
要搜索除此之外的任何内容,您需要在括号内插入一个额外的^
,以创建除此之外的匹配:@“^[^\\\/:?”“|]+$”
将^
保留在行的开头,并与行的开头相匹配
话虽如此,为了验证浏览器处理文件名的方式是否不同,请记住。一些较旧的浏览器随文件名一起发送了路径,这可能会破坏您对合法文件的验证。此正则表达式应匹配足够多的有效NTFS文件名子集(请记住,NTFS文件名可能包含几乎所有的Unicode字符。)
这一部分帮助我解决了这个问题”“谢谢。但不幸的是,我仍然停留在逻辑上。谢谢你,保罗。在检查你的评论之前,我尝试了这个方法,它成功了,但现在我有了一个解释,为什么要这样做。我必须检查我的验证是否破坏了一个合法的文件名。是的,通常这会起作用,但正如我所说的,一些浏览器发送实际路径或预先添加一些奇怪的内容,如://。如果可以的话,最好是通过删除
System.IO.Path.GetInvalidPathChars()
返回的任何字符来清理请求处理程序中的文件名。我完全意识到我实际上已经实现了清理。今天早上咖啡不够。再次感谢,这对我来说是一次很好的学习经历。
Regex rxValidFileName = new Regex(@"^[[\p{IsBasicLatin}\p{IsLatin-1Supplement}\p{IsLatinExtended-A}\p{IsLatinExtended-B}]-[\p{C}<>:""/\|?*]]+$" , RegexOptions.IgnorePatternWhitespace|RegexOptions.IgnoreCase);
filepath : relative-path
| absolute-path
| drivespecifier (relative-path|absolute-path)?
| unc-share (absolute-path)?
;
relative-path : filename ( directory-separator filename? )*
absolute-path : directory-separator ( filename? directory-separator )*
directory-separator : [/\]
drivespecifier : [a-zA-Z] ":"
unc-share : "\\" filename "\" filename absolute-path?