Layui上传组件如何实现根据文件大小自动分类存放

文件大小必须在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 对象的字节值,真实、即时、无延迟。别试图从 beforedone 里取 —— 这两个回调里 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.roundtoFixed(0) 更适合做整数判断

分类逻辑要同步到 urldata

Layui 不支持运行时切换 url,所以得在 choose 里提前存好分类结果,再在 beforebindAction 触发时注入:

  • choose 中缓存分类信息:var uploadType = sizeKB
  • uploadType 存到闭包变量或 DOM dataset 里(比如 document.querySelector('#uploadBtn').dataset.type = uploadType
  • before 回调里读这个值,动态拼接 url 或往 this.data 里加字段:this.data.category = uploadType
  • 服务器端据此路由到不同存储路径,比如 /storage/small/xxx.jpg vs /storage/large/xxx.mp4

多文件场景下分类逻辑要逐个独立处理

如果开了 multiple: trueobj.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

任务队列中的“任务”是如何进入队列的
上一篇 2026-07-01 11:18
vivo手机怎么设置应用分身后的第二个应用重命名
下一篇 2026-07-01 11:18

相关推荐