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

Javascript拖拽上传图片无法获取Height & Width,求解决方案

解决拖拽上传图片无法获取宽高的问题

问题出在图片加载时机上——你设置img.src后,图片还没完成加载,此时直接获取宽高会得到0或者不准确的值,不管是按钮上传还是拖拽上传都存在这个问题。正确的做法是监听图片的load事件,在图片完全加载后再获取宽高信息。

修改你的fileHandler函数,调整如下:

const fileHandler = (file, name, type) => {
  if (type.split("/")[0] !== "image") {
    error.innerText = "Please upload an image file";
    return false;
  }
    
  error.innerText = "";
  let reader = new FileReader();
  reader.readAsDataURL(file);
  reader.onloadend = () => {
    let imageContainer = document.createElement("figure");
    let img = document.createElement("img");
      
    img.src = reader.result;
    // 监听图片加载完成事件,此时才能获取准确的宽高
    img.onload = () => {
      const width = img.width;
      const height = img.height;
      // 这里可以处理宽高信息,比如添加到figcaption或者做其他逻辑
      imageContainer.innerHTML += `<figcaption>${name} (${width}×${height})</figcaption>`;
    };
    imageContainer.appendChild(img);
    imageDisplay.appendChild(imageContainer);
  };
};

关键修改点:

  • 给创建的img元素添加onload事件回调,图片加载完成后才执行宽高获取逻辑
  • 将原本直接拼接figcaption的代码移到onload回调里,确保宽高信息已经就绪
  • 不管是按钮上传还是拖拽上传的图片,都会经过这个逻辑,因此两者都能正确获取宽高

完整的修改后代码如下:

let uploadButton = document.getElementById("upload-button");
let chosenImage = document.getElementById("chosen-image");
let fileName = document.getElementById("file-name");
let container = document.querySelector(".container");
let error = document.getElementById("error");
let imageDisplay = document.getElementById("image-display");

const fileHandler = (file, name, type) => {
  if (type.split("/")[0] !== "image") {
    error.innerText = "Please upload an image file";
    return false;
  }
    
  error.innerText = "";
  let reader = new FileReader();
  reader.readAsDataURL(file);
  reader.onloadend = () => {
    let imageContainer = document.createElement("figure");
    let img = document.createElement("img");
      
    img.src = reader.result;
    // 图片加载完成后获取宽高
    img.onload = () => {
      const imgWidth = img.width;
      const imgHeight = img.height;
      // 可以在这里使用宽高做任何你需要的操作
      imageContainer.innerHTML += `<figcaption>${name} - 尺寸:${imgWidth}px × ${imgHeight}px</figcaption>`;
    };
    imageContainer.appendChild(img);
    imageDisplay.appendChild(imageContainer);
  };
};

//Upload Button
uploadButton.addEventListener("change", () => {
  imageDisplay.innerHTML = "";
  Array.from(uploadButton.files).forEach((file) => {
    fileHandler(file, file.name, file.type);
  });
});

container.addEventListener(
  "dragenter",
  (e) => {
    e.preventDefault();
    e.stopPropagation();
    container.classList.add("active");
  },
  false
);

container.addEventListener(
  "dragleave",
  (e) => {
    e.preventDefault();
    e.stopPropagation();
    container.classList.remove("active");
  },
  false
);

container.addEventListener(
  "dragover",
  (e) => {
    e.preventDefault();
    e.stopPropagation();
    container.classList.add("active");
  },
  false
);

container.addEventListener(
  "drop",
  (e) => {
    e.preventDefault();
    e.stopPropagation();
    container.classList.remove("active");
    let draggedData = e.dataTransfer;
    let files = draggedData.files;
    imageDisplay.innerHTML = "";
    Array.from(files).forEach((file) => {
      fileHandler(file, file.name, file.type);
    });
  },
  false
);

window.onload = () => {
  error.innerText = "";
};

这样修改后,无论是按钮上传还是拖拽上传的图片,都能在加载完成后准确获取宽高信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:23:10