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

本地环境下图片src存在但img.onload未触发且onerror触发的问题

问题:Image实例onload未触发反而触发onerror,且img.complete返回true?

我开发了一个自定义图片(文件)上传器,可成功上传并在上传器内预览图片。我需要获取上传图片的宽高,以便在其超出特定尺寸时将其压缩至合适大小。但创建新Image实例后,onload函数未触发,反而触发了onerror函数。

上传的文件数据截图:
上传的文件数据

相关代码:

console.log(file) //上方输出的内容
let img = new Image()
img.onload = () => console.log('loaded') //未触发
img.onerror = () => console.log('error') //触发
img.complete //返回true
img.src = file.name 
console.log(img.src) //http://localhost:3000/maxresdefault.png

请问为何img.complete返回true的同时onerror会被触发?


原因分析与解决办法

核心问题:src赋值错误

你给img.src赋值的是file.name,这只是上传文件的文件名,并不是能让浏览器加载到图片的有效地址。浏览器会把它当作当前域名下的相对路径去请求(比如你这里变成了http://localhost:3000/maxresdefault.png),但服务器上根本没有这个文件,所以加载失败触发onerror。

为什么img.complete返回true?

Image的complete属性返回true的场景包括:图片加载完成、加载失败、或者图片没有设置src。这里因为你设置的src无效,加载失败后,complete就会变成true,同时触发onerror事件。

正确获取图片宽高的方法

要读取本地上传的File对象,得用Blob URL或者FileReader生成可访问的图片地址:

方法一:使用URL.createObjectURL

console.log(file)
let img = new Image()
img.onload = function() {
  console.log('loaded')
  console.log('图片宽高:', this.width, 'x', this.height)
  // 用完释放临时URL资源
  URL.revokeObjectURL(this.src)
}
img.onerror = () => console.log('图片加载失败')
img.src = URL.createObjectURL(file)

方法二:使用FileReader

console.log(file)
const reader = new FileReader()
reader.onload = function(e) {
  let img = new Image()
  img.onload = () => {
    console.log('loaded')
    console.log('图片宽高:', img.width, 'x', img.height)
  }
  img.onerror = () => console.log('图片加载失败')
  img.src = e.target.result
}
reader.readAsDataURL(file)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:30:54