在不验证文件路径的情况下检查文件名中的无效字符(特殊字符和国际字符)

Check for Invalid characters(Special Characters & International character) in file name without validating file path

我试图在不验证文件路径的情况下验证文件名中包含无效字符的文件名。我尝试了各种组合,但我的 javascript 函数中的 none 似乎可以解决问题。

 @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;
        }
    }

这是我通常用来验证 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)"

在 .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
}