唯一可靠方式是在 choose 回调中读取 obj.files[0].lastModified 获取文件最后修改时间(毫秒时间戳),因 before、done 回调中 obj.files 已为空,且 obj.elem.files 和 preview 回调均无法访问该属性。
choose 回调里读 obj.files[0].lastModified 是唯一可靠方式
文件最后修改时间(毫秒时间戳)只能在 choose 回调中通过 obj.files[i].lastmodified 获取,这是浏览器原生 file 对象的标准属性。错过这个时机,后续的 before、done 回调里 obj.files 已为空或不存在,无法访问。
常见错误包括:
- 在
before里写obj.files[0].lastModified—— 此时obj.files多数版本已清空(Layui 2.9+ 行为) - 误用
obj.elem.files[0].lastModified——obj.elem是被 Layui 封装过的 DOM 元素,其files属性始终为空 - 试图从
obj.preview()的回调参数里取lastModified—— 它只传回内容数据(如 base64),不保留原始File元信息
lastModified 和 lastModifiedDate 的兼容性差异
lastModified 返回毫秒时间戳(推荐),lastModifiedDate 返回 Date 实例(已废弃但部分旧浏览器仍支持)。两者值一致,但行为不同:
- 现代浏览器(Chrome/Firefox/Edge 最新版)均支持
lastModified - Safari 15.4+ 支持
lastModified;Safari 14 及更早版本只认lastModifiedDate,需 fallback - IE 10–11 不支持
lastModified,必须用lastModifiedDate.getTime()
实操建议统一用:
const mtime = obj.files[0].lastModified || obj.files[0].lastModifiedDate?.getTime();
转成可读日期字符串要手动格式化
lastModified 是毫秒时间戳,直接 new Date(mtime) 会受本地时区影响,显示时间可能比系统实际修改时间偏移(尤其跨时区部署场景):
- 若需展示“用户本地感知时间”,直接
new Date(mtime).toLocaleString() - 若需服务端对齐(如校验文件新鲜度),建议传毫秒值过去,由后端统一解析
- 避免用
toISOString()后截断——它返回 UTC 时间,和用户看到的“最后修改时间”语义不符
示例(中文格式):
const date = new Date(obj.files[0].lastModified);
const formatted = `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2,'0')}-${String(date.getDate()).padStart(2,'0')} ${String(date.getHours()).padStart(2,'0')}:${String(date.getMinutes()).padStart(2,'0')}`;
大文件或特殊文件类型下该属性是否可用
lastModified 在所有支持 FileList 的浏览器中都即时可用,与文件大小无关:
- 即使文件 >2GB,点击选择后立刻能读到该值(浏览器在对话框确认瞬间就解析了元数据)
- 对 .zip、.pdf、.xlsx 等非图片文件同样有效,不依赖
preview或任何读取操作 - 唯一例外是某些企业定制浏览器或老旧 WebView(如 Android 4.4 内置浏览器),可能完全缺失该属性,需降级提示
真正容易出问题的是后续环节:比如后端没配好 nginx 的 client_max_body_size,导致上传失败,但前端取 lastModified 这步本身不会因此报错或失效。











