我正在尝试验证文件名中包含无效字符的文件名,而不验证文件路径。我尝试了各种组合,但我的javascript函数似乎都没有。
@Html.TextBoxFor(model => model.Attachment, new { type = "file" , onchange = "ValidateFileName(this)" })
JS:
function ValidateFileName(name) {
if (name.value.match(/\.\.[a-z][a-z][a-z]$/) || name.value.match(/\.\.[a-z][a-z][a-z][a-z]$/) || name.value.match(/^(?!\.)(?!com[0-9]$)(?!con$)(?!lpt[0-9]$)(?!nul$)(?!prn$)[^\|\*\?\\:%<>/$"]*[^\.\|\*\?\\:%<>/$"]+$/)) {
alert('Invalid file extension.');
name.form.reset();
name.focus();
return false;
}
}
答案 0 :(得分:1)
这是我通常用于验证Windows文件名的正则表达式:
^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\";|/]+$
但如果您的name
变量包含文件路径,则首先必须使用以下方法从中提取文件名:
var filename = name.split(/(\\|\/)/g).pop();
或:
var name_pieces = name.split('\\');
var filename = name_pieces[name_pieces.length - 1];
在旁注中,仔细检查代码的这一部分的行为:
onchange = "ValidateFileName(this)"
因为我觉得有些问题正在发生......我不知道,但有些事情继续告诉我应该写成:
onchange = "ValidateFileName(this.value)"
答案 1 :(得分:0)
在.NET中,您可以使用Path.GetInvalidFileNameChars()
静态方法获取无效字符列表。 (注意:文件路径字符也有Path.GetInvalidPathChar()
,它们不同。)
在服务器端,您可以这样做:
var invalidChars = Path.GetInvalidFileNameChars();
var hasBadChars = filename.Any(c => invalidChars.Contains(c));
对于JS方面,您可以将invalidChars输出到JS数组服务器端,然后执行以下操作:
if (invalidChars.some(function(v) { return filename.indexOf(v) >= 0; })) {
// There's at least one
}