You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HTML+PHP Web应用中获取并保留客户端原文件修改时间?

解决文件上传时保留原文件修改时间的问题

Google Drive的实现逻辑

Google Drive是借助浏览器的File API读取原文件的元数据(包含修改时间),再将这些元数据与文件内容一同上传至服务器:

  • 用户通过<input type="file">选择文件后,浏览器可从input.files中获取File对象,直接读取其lastModified属性,这就是原文件的修改时间戳。
  • 上传过程中,Google Drive会把该时间戳作为额外参数或请求头发送到后端,后端收到文件后,用这个时间戳修改保存后文件的mtime(修改时间)。

可行的实现方案

前端通过File API获取元数据,与文件一同上传

  1. 前端代码示例:
<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>
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:15:37