HTML文件上传时无法获取创建时间,浏览器仅提供lastModified(最后修改时间戳),可用其代理校验文件时效性,但需注意系统时间篡改、解压重置、复制覆盖等导致的不准确问题。

HTML 文件上传时无法直接读取文件创建时间
浏览器出于安全限制,File 对象(即 e.target.files[0])只暴露 lastModified 和 lastModifiedDate,不提供 createdTime 或类似字段。所谓“文件创建时间”在前端根本不可见——这不是 API 漏了,而是所有主流浏览器(Chrome、Firefox、Safari)主动屏蔽了该信息。
你看到的 lastModified 是文件在用户本地磁盘上最后一次被写入的时间戳(毫秒数),它可能等于创建时间(如新下载后未修改),也可能远晚于创建时间(如用户编辑过文档)。别试图用 new File() 或 FileReader 去“恢复”创建时间,做不到。
用 lastModified 代替“创建时间”做业务校验的实操要点
如果业务逻辑实质是“拒绝太老的文件”(例如:只接受近 30 天内生成的报告),可以用 lastModified 作为代理指标,但必须清楚它的局限性:
- 用户可能手动改过系统时间,导致
lastModified不可靠 - 从邮件附件解压出来的文件,
lastModified常被重置为解压时刻 - Windows 下复制文件时若未保留属性,
lastModified会变成复制时间 - 务必用
file.lastModified(数字),不要用file.lastModifiedDate(已废弃的 Date 对象)
判断示例:
立即学习“前端免费学习笔记(深入)”;
const cutoff = Date.now() - 30 * 24 * 60 * 60 * 1000; // 30天前的时间戳
if (file.lastModified < cutoff) {
alert("文件时间过早,请上传近30天内生成的文件");
return;
}服务端才是校验“真实创建时间”的唯一可信位置
真正需要确认原始创建时间的场景(如法律文书、审计材料),前端校验只是辅助提示,最终必须依赖服务端:
- 后端接收文件后,可通过系统调用(如 Node.js 的
fs.stat().birthtime)尝试读取 birthtime —— 但注意:Linux ext4/xfs 默认不存 birthtime,macOS APFS 支持,Windows NTFS 支持 - 更通用的做法是要求用户在表单中手动填写“文件生成日期”,并和
lastModified做交叉比对(例如差值超过 1 小时就标黄提醒) - 若文件是 PDF/DOCX 等格式,后端可解析元数据(如 PDF 的
CreationDate字段),但这依赖格式规范且易被篡改
容易被忽略的关键细节
别在 change 事件里直接用 file.lastModified 就完事:
- 某些老旧 Android WebView 中,
lastModified可能返回0或NaN,需加防御:if (!file.lastModified || file.lastModified -
lastModified是毫秒时间戳,不是字符串,别误当 ISO 格式日期去split('-') - 用户拖拽上传(
drop事件)和点击input[type="file"]获取的File对象行为一致,无需区分处理
真正难的从来不是怎么读那个时间,而是搞清业务到底要防什么——是防用户随手选个十年前的模板文件?还是防伪造关键时间证据?前者用 lastModified 加前端提示就够了;后者必须绕过浏览器,把校验下沉到可信环境里做。



















