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

exif.js v3.3.25多选文件时仅能读取最后一张照片的DateTimeOriginal问题

解决多选文件时EXIF.js仅最后一张返回DateTimeOriginal的问题

问题原因

你代码里的file变量用var声明,属于函数级作用域。EXIF.getData是异步方法,当回调函数执行时,for循环已经跑完,所有回调里的file都指向循环最后一个文件,导致只有最后一张能拿到正确的EXIF时间数据,其余都是undefined。

解决方案

方案1:使用let声明变量(推荐)

let是块级作用域,每个循环迭代都会创建独立的file变量,确保回调引用的是当前迭代的文件:

function fileSelected() {
  const files = document.getElementById("fileData").files;
  for (let index = 0; index < files.length; index++) {
    const file = files[index];
    EXIF.getData(file, function() {
      const origtime = EXIF.getTag(file, "DateTimeOriginal");
      alert(origtime);
    }); 
  }
}

方案2:用forEach遍历文件

forEach的回调函数会形成独立作用域,每个文件都能被正确捕获:

function fileSelected() {
  const files = document.getElementById("fileData").files;
  // 把FileList转成数组再遍历
  Array.from(files).forEach(file => {
    EXIF.getData(file, function() {
      const origtime = EXIF.getTag(file, "DateTimeOriginal");
      alert(origtime);
    }); 
  });
}

方案3:使用闭包包裹(兼容旧环境)

如果需要兼容不支持let的旧浏览器,可以用立即执行函数(IIFE)创建独立作用域:

function fileSelected() {
  var count = document.getElementById("fileData").files.length;
  for (var index = 0; index < count; index++) {
    var file = document.getElementById("fileData").files[index];
    // 用IIFE捕获当前迭代的file
    (function(currentFile) {
      EXIF.getData(currentFile, function() {
        var origtime = EXIF.getTag(currentFile, "DateTimeOriginal");
        alert(origtime);
      });
    })(file);
  }
}

额外提示:尽量用const/let替代var,避免作用域混淆;同时给origtime加上变量声明,防止污染全局作用域。

内容的提问来源于stack exchange,提问作者chrisrth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:20:34