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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在不验证文件路径的情况下检查文件名中的无效字符(特殊字符和国际字符)相关的知识,希望对你有一定的参考价值。

我试图验证文件名中包含无效字符的文件名,而不验证文件路径。我尝试了各种组合,但我的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;
        }
    }
答案

这是我通常用于验证Windows文件名的正则表达式:

^(?!^(PRN|AUX|CLOCK$|NUL|CON|COMd|LPTd|..*)(..+)?$)[^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
}

以上是关于在不验证文件路径的情况下检查文件名中的无效字符(特殊字符和国际字符)的主要内容,如果未能解决你的问题,请参考以下文章

字符串路径验证

在不尝试打印的情况下验证 Postscript?

PyQt - 如何在不关闭对话框窗口的情况下停止执行

如何在不运行Bash脚本的情况下语法检查?

Java中有没有办法在不尝试创建文件的情况下确定路径是不是有效?

在不加载 .mat 文件的情况下检查变量是不是在 .mat 文件中的快速方法? 'who'/'whos' 并不比加载快.. 比 'who' 更好的选择?