文件大小必须在choose回调中读取obj.files[0].size,此时值真实即时;before/done回调无files属性,obj.file.size和obj.elem.files[0].size均错误;size配置仅用于校验拦截,分类需手动计算KB值。
choose 回调里读 obj.files[0].size 是唯一可靠时机
文件大小必须在 choose 回调中读取,此时 obj.files[0].size 返回的是原始 file 对象的字节值,真实、即时、无延迟。别试图从 before 或 done 里取 —— 这两个回调里 obj 不带 files 属性;也别写成 obj.file.size(根本不存在)或 obj.elem.files[0].size(layui 已接管 input,dom 上为空)。
按 KB 分类时,自己算,别信 size 配置项
size: 2048 这类配置只用于内置校验拦截,不暴露数值,也不参与分类逻辑。你想把 ≤1MB 的放 /small/,>1MB 的走 /large/,就得手动计算:
var sizeKB = Math.round(obj.files[0].size / 1024)- 然后用
if (sizeKB 动态设上传地址 - 注意:单位是 KB,不是 MB,别混淆;
Math.round比toFixed(0)更适合做整数判断
分类逻辑要同步到 url 和 data
Layui 不支持运行时切换 url,所以得在 choose 里提前存好分类结果,再在 before 或 bindAction 触发时注入:
- 在
choose中缓存分类信息:var uploadType = sizeKB - 把
uploadType存到闭包变量或 DOM dataset 里(比如document.querySelector('#uploadBtn').dataset.type = uploadType) - 在
before回调里读这个值,动态拼接url或往this.data里加字段:this.data.category = uploadType - 服务器端据此路由到不同存储路径,比如
/storage/small/xxx.jpgvs/storage/large/xxx.mp4
多文件场景下分类逻辑要逐个独立处理
如果开了 multiple: true,obj.files 是 FileList,不能直接 forEach,得先转数组:
Array.from(obj.files).forEach(file => { ... })- 每个文件单独算
file.size,各自决定走哪个 URL 或 category - 但 Layui 默认只支持单个
url,所以实际要配合auto: false+ 手动obj.upload(index, file)逐个提交,否则无法差异化上传 - 这意味着你得自己维护上传队列、状态标记和重试逻辑,Layui 不代劳
文件大小分类这事,表面是“判断+路由”,实际卡点在:Layui 的 url 是静态配置项,没法运行时改;而真正的分类依据(file.size)又只在 choose 瞬间有效。绕不开手动拆解、逐个上传、服务端协同这三步。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/123517.html