layui upload 不支持文件有效期验证,因前端无法可信获取创建时间等元数据,仅能用 lastmodified 做粗略提示,真正校验必须由服务端完成。
layui upload 本身不支持文件有效期验证——所谓“有效期”,必须由业务逻辑定义(如上传时间戳、文件内嵌元数据、服务端签名校验等),前端无法直接读取或判断。
为什么不能在 choose 或 before 里做“有效期”校验
文件对象 File 只暴露 name、size、type、lastModified 四个基础属性,其中 lastModified 是用户本地修改时间,可被任意篡改,不具备可信度。浏览器禁止 JS 读取文件创建时间、原始拍摄时间、数字签名等真实有效期依据。
- 用户改系统时间后保存文件,
file.lastModified就失效 - 压缩包、PDF、视频等格式可能含真实时间戳,但需服务端解析(如
ffprobe、exiftool) - 前端无法验证证书、签名、区块链哈希等强时效性凭证
可行的替代方案:用 lastModified 做粗略客户端拦截(仅作提示)
若业务允许宽松策略(例如“不允许上传 24 小时前生成的文件”),可在 choose 回调中用 file.lastModified 做即时比对,但必须明确告知用户这是参考值,且服务端必须重复校验。
- 计算时间差:
Date.now() - file.lastModified > 24 * 60 * 60 * 1000 - 提示文案要注明:“此检查基于您电脑的时间,最终以服务器判定为准”
- 仍需调用
obj.reset()清空选择,并返回(不能靠return false) - 注意 IE 不支持
lastModified,需 fallback 到file.lastModifiedDate
真正可靠的做法:服务端生成带时效的上传凭证
前端不校验“有效期”,而是请求一个有时效限制的上传 Token,由服务端控制整个生命周期。
- 用户操作前先调
/api/upload/token?expires_in=3600,返回含签名和过期时间的uploadToken - 将该 token 传给
upload.render({ data: { token: 'xxx' } }) - 服务端收到上传请求后,验证 token 签名 + 过期时间 + 绑定的用户/业务 ID
- 上传成功后立即作废该 token,防止重放
- 这样,“有效期”实际是上传行为的有效窗口,而非文件内容本身
复杂点在于:文件内容里的有效期无法绕过服务端
如果业务真要求校验 PDF 的签署时间、视频的录制时间、身份证图像的签发日期,这些都必须由服务端提取元数据并比对规则——前端最多预加载并显示预览,但不能替代验证。任何试图在浏览器里解析 EXIF、MP4 moov box、PDF XMP 的方案,都会遇到兼容性、性能、安全性三重障碍,且易被绕过。











