choose是唯一能可靠获取原始文件名和大小的地方,因其同步暴露浏览器原生解析的filelist;before中obj.files为空,done仅返回服务端响应,preview会触发大文件读取风险且file为副本。

只能在 choose 回调里读 obj.files,其他地方全不可靠。
为什么 choose 是唯一能拿到原始文件名和大小的地方
因为浏览器在用户点击“打开”对话框并确认后,就已解析出所有文件元信息(name、size、type),而 Layui 只在 choose 回调中同步把原生 FileList 挂到 obj.files 上。其他回调要么没这个属性(before、done),要么是异步副作用(preview 会触发 FileReader,大文件直接卡死)。
常见错误包括:
- 在
before里写obj.files[0].name—— Layui 2.9+ 中此时obj.files已为空 - 误用
obj.file.size或obj.elem.files[0].size—— 这两个路径根本不存在或已被清空 - 依赖
obj.pushFile()返回值取size—— 它返回的是内部队列 ID 映射,size字段不准确甚至缺失
choose 回调里怎么安全读取 name 和 size
直接遍历 obj.files,每个元素都是标准 File 实例:
- 单文件:用
obj.files[0].name和obj.files[0].size - 多文件:遍历
for (let i = 0; i ,取 <code>obj.files[i].name和obj.files[i].size -
size单位是字节,转 KB 要除以1024(不是1014),保留一位小数可用(file.size / 1024).toFixed(1) - IE 9 及以下不支持
FileList,需降级提示或禁用多选
别碰 preview 来取名取大小
obj.preview() 是为预览设计的,不是为读元数据。它内部调用 FileReader.readAsDataURL(),对 >100MB 文件极易阻塞主线程、爆内存,甚至被浏览器中止。更关键的是:
- 你只是想看个名字和大小,完全不需要加载整个文件内容
- 某些旧版 Layui(如 2.8.x)在
FileReader失败后 fallback 不完整,file.name或file.size可能丢失 - 即使必须用
preview(比如做缩略图),也得加try/catch和超时控制,不能让它影响主流程
真正容易被忽略的一点:超大文件(>2GB)下 obj.files[0].name 和 obj.files[0].size 依然有效 —— 浏览器解析元信息不依赖读文件内容。但 Safari 对 >4GB 文件的 size 可能返回 0,这时只能 fallback 到仅显示文件名,并提示“大小暂不可读”。











