File.lastModified是获取拖拽文件最后修改时间的标准可靠方式,返回毫秒级数字时间戳,需用new Date()转换为日期对象才能格式化;它同步可用,无需FileReader,且所有现代浏览器均支持。

File.lastModified 读取文件最后修改时间
拖拽进浏览器的文件对象本身带有时戳信息,File.lastModified 就是标准、可靠、无需额外权限的方式。它返回毫秒级时间戳(类似 Date.now()),不是字符串,也不是 Date 实例——这点容易误用。
常见错误:直接 console.log(file.lastModified) 看到一串数字就以为错了;或试图调用 .toISOString() 报错,因为它是 number 类型。
- 正确做法:用
new Date(file.lastModified)转成日期对象再格式化 - 兼容性:所有现代浏览器都支持,包括 Edge 16+,无需 polyfill
- 注意:该值来自操作系统,用户可手动修改系统时间或文件属性,不可用于校验真实性
为什么不能用 FileReader 读取文件元数据?
FileReader 只能读取文件内容(文本、ArrayBuffer 等),不提供访问文件系统元数据(如修改时间、创建时间、路径)的能力。试图用 readAsText() 或 readAsDataURL() 后解析出时间,纯属徒劳——那些信息根本不在文件内容里。
有人试过读取文件头或用 File.name 解析时间戳命名(如 report_20240520.xlsx),这属于业务层约定,和真实修改时间无关,且极易失效。
- File 对象的元数据(
name、size、type、lastModified)在拖拽drop事件触发时已就绪,无需异步读取 -
File.lastModified是同步可用的,别绕路走 FileReader - 如果需要创建时间(
birthTime),目前 HTML 标准未暴露,浏览器也不提供
拖拽事件中获取 File 对象的典型路径
关键不是“怎么读时间”,而是“从哪拿到 File 对象”。很多人卡在事件处理链上:监听了 drop,但没阻止默认行为,或从 dataTransfer.files 取值逻辑有误。
示例片段(仅核心逻辑):
dropArea.addEventListener('drop', (e) => {
e.preventDefault(); // 必须!否则会跳转或下载
const files = e.dataTransfer.files; // 是 FileList,非数组
for (let i = 0; i
-
e.dataTransfer.files是只读的FileList,不能用数组方法(如map),需用for或转成数组:Array.from(files) - 别漏掉
e.preventDefault(),否则 Chrome/Firefox 会尝试打开文件,导致drop事件中断 - 移动端不支持原生拖拽文件,此方案仅适用于桌面端
lastModified 和 lastModifiedDate 的区别
File.lastModifiedDate 是旧规范属性,返回 Date 对象;File.lastModified 是现行标准,返回毫秒数。前者已被废弃(MDN 标记为 deprecated),虽仍可用,但行为不一致:
- Chrome 89+ 中
lastModifiedDate返回null(即使lastModified有值) - Safari 一直不支持
lastModifiedDate - 务必只用
lastModified,配合new Date()构造即可
顺带一提:没有 createdTime 或 accessedTime —— 浏览器出于隐私限制,不会暴露这些字段。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











