Layui upload 模块需在 before 回调中手动拦截黑名单文件名,通过 Array.from(obj.getChooseFiles()).some() 精确匹配 blackList 数组(建议小写比对),返回 false 阻断整批上传并提示违规文件名,不可在 choose 中校验或修改源码。
用 before 回调手动拦截黑名单文件名
layui 的 upload 模块本身不提供文件名黑名单(如禁止上传 config.js、secret.txt),exts 只支持后缀白名单,无法按完整文件名过滤。必须在 before 中自行遍历 obj.getchoosefiles(),逐个比对文件名字符串。
常见错误现象:只检查第一个文件(files[0]),忽略多选时的其余项;或用 indexOf 匹配子串(如 "config" 误杀 "myconfig.bak"),导致误拦。
- 黑名单应定义为精确匹配的数组,例如:
const blackList = ['config.js', 'secret.txt', '.env', 'Thumbs.db'] - 使用
Array.from(obj.getChooseFiles())转换为真数组,再用some()判断是否存在命中项 - 区分大小写:Windows 下文件名不敏感,但 Linux / 服务端可能敏感,建议统一转小写比对(
file.name.toLowerCase()) - 返回
false阻止整个上传批次,不支持“只跳过某几个”——Layui 没有单文件级跳过机制
注意 choose 和 before 的分工边界
choose 回调里能拿到原始 FileList,但此时还没触发上传流程;before 是唯一能同步阻断上传的时机。很多人误把校验逻辑写在 choose 里并试图 return false,这完全无效——choose 的返回值被忽略。
使用场景:用户多选 5 个文件,其中 1 个是 backup.zip(在黑名单中),需整体取消本次上传,并提示具体被拒文件名。
实操建议:
- 在
before中调用obj.getChooseFiles(),不要依赖obj.files(它可能为空或滞后) - 提前收集违规文件名,用于提示:
const blocked = files.filter(f => blackList.includes(f.name)); - 提示信息要明确,例如:
layer.msg(`禁止上传:${blocked.map(f => f.name).join('、')}`, {icon: 2}); - 避免在
before中做异步操作(如请求后端校验),否则会因 Promise 未 resolve 导致上传挂起
为什么不能靠修改 upload.js 源码实现黑名单
网上有方案建议直接注释 upload.js 中的 y=function 并硬编码逻辑,这种做法风险极高:
- 升级 Layui 时源码修改会被覆盖,问题重现且难以追踪
- 黑名单规则随业务变化频繁,硬编码导致维护成本陡增
- 多个 upload 实例共用同一份源码,无法差异化配置(如 A 按钮禁
.log,B 按钮禁.tmp) - Layui 2.8+ 已稳定支持
before同步拦截,无需侵入源码
真正容易被忽略的是:黑名单规则常需与权限、环境联动(例如测试环境允许上传 mock.json,生产环境禁止),这类动态逻辑只能在 JS 层运行时判断,没法塞进静态配置里。











