如何修改JS代码正确校验文件扩展名是否符合允许/禁止规则
问题原因分析
- 空字符串分割异常:当
allowed变量为空字符串时,执行split(",")会得到包含一个空字符串的数组[""],处理后的allowedArray仅包含空值,所有正常扩展名都无法命中allowedArray.includes(str)判断,导致所有结果返回false。 - 逻辑不符合业务规则:原代码要求扩展名必须同时在允许列表且不在禁止列表才返回true,没有兼容允许列表为空时的放行规则。
- 缺少输入统一处理:传入的
str参数未做小写转换,若传入大写扩展名会匹配失败。
修复后的代码
var allowed = ""; var disallowed = "xlsx, docx, png"; function testAllowedOrNot(str) { // 统一转换输入的扩展名为小写 const targetExt = str.trim().toLowerCase(); // 处理禁止列表:分割后去空、去空格、转小写 const disallowedArray = disallowed.split(",") .map(ext => ext.trim().toLowerCase()) .filter(ext => ext); // 过滤空元素,避免空配置时生成无效空值 // 禁止列表优先级最高,命中直接返回false if (disallowedArray.includes(targetExt)) { return false; } // 处理允许列表:分割后去空、去空格、转小写 const allowedArray = allowed.split(",") .map(ext => ext.trim().toLowerCase()) .filter(ext => ext); // 允许列表为空直接放行,否则判断是否在允许列表中 return allowedArray.length === 0 ? true : allowedArray.includes(targetExt); } // 测试用例 console.log(testAllowedOrNot("csv")) // 输出true console.log(testAllowedOrNot("xlsx")) // 输出false console.log(testAllowedOrNot("ico")) // 输出true console.log(testAllowedOrNot("jpg")) // 输出true console.log(testAllowedOrNot("docx")) // 输出false
逻辑说明
- 禁止列表优先级最高:只要扩展名在禁止列表内,无论其他配置如何直接返回false
- 允许列表为空时,所有不在禁止列表的扩展名全部允许,匹配规则1
- 禁止列表为空时,会直接跳过禁止判断,若允许列表也为空则全部放行,匹配规则2、3
- 允许列表不为空时,仅允许列表内且不在禁止列表的扩展名返回true
- 所有扩展名统一转小写处理,避免大小写匹配问题
- 列表处理时增加空值过滤,避免空字符串分割产生的无效空元素影响判断
内容的提问来源于stack exchange,提问作者Code Guy
相关产品推荐
相关产品推荐

