如何在HTML+PHP Web应用中获取并保留客户端原文件修改时间?
解决文件上传时保留原文件修改时间的问题
Google Drive的实现逻辑
Google Drive是借助浏览器的File API读取原文件的元数据(包含修改时间),再将这些元数据与文件内容一同上传至服务器:
- 用户通过
<input type="file">选择文件后,浏览器可从input.files中获取File对象,直接读取其lastModified属性,这就是原文件的修改时间戳。 - 上传过程中,Google Drive会把该时间戳作为额外参数或请求头发送到后端,后端收到文件后,用这个时间戳修改保存后文件的
mtime(修改时间)。
可行的实现方案
前端通过File API获取元数据,与文件一同上传
- 前端代码示例:
<input type="file" id="fileInput"> <script> document.getElementById('fileInput').addEventListener('change', function(e) { const file = e.target.files[0]; if (file) { const formData = new FormData(); formData.append('file', file); // 携带原文件修改时间字段 formData.append('original_mtime', file.lastModified); fetch('upload.php', { method: 'POST', body: formData }); } }); </script>
- PHP后端处理:
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { $uploadPath = 'uploads/' . basename($_FILES['file']['name']); move_uploaded_file($_FILES['file']['tmp_name'], $uploadPath); // 将毫秒级时间戳转为秒级,适配PHP的touch函数 $originalMtime = (int)($_POST['original_mtime'] / 1000); // 修改文件的访问时间和修改时间 touch($uploadPath, $originalMtime, $originalMtime); }
该方案直接利用浏览器File API读取元数据,避开了无法获取原文件路径的限制。
其他备选方案
- 桌面端辅助工具:若用户场景允许,可开发轻量桌面应用(如Electron),通过桌面端读取本地文件完整元数据,再将文件与元数据一起上传至Web应用,不受浏览器安全限制,能获取更全面的文件属性。
- FTP/SFTP上传:若用户具备技术能力,提供FTP/SFTP上传选项,这种方式下文件的元数据(包括修改时间)会被完整保留,后端无需额外处理。
关键注意点
file.lastModified返回的是毫秒级时间戳,PHP的touch函数需要秒级时间戳,需除以1000转换。- 前端传递的时间戳存在被篡改的可能,若有数据真实性要求,需结合文件哈希等方式做额外验证。
内容的提问来源于stack exchange,提问作者user16088441
相关产品推荐
相关产品推荐

