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

Vue.js实现文件上传前校验图片宽高、大小的方法及异常修复

问题根因
  • 核心错误是image.src赋值对象错误:你当前给Image实例绑定的是上传前的旧资源地址this.upload_header,而非刚读取到的新图片的DataURL(也就是e.target.result),所以永远拿不到新上传图片的宽高。
  • 校验顺序不合理:文件类型、大小这类可以同步判断的校验,不需要等到图片资源加载完成再执行,提前校验失败可直接终止逻辑,减少不必要的资源加载。
  • 缺少异常兜底:未处理图片加载失败的场景(比如用户修改后缀名伪装的图片文件),会导致校验状态卡死。
修正后完整代码
onFileInputChange(event: any): FileReader {
  const files = event.target.files || event.dataTransfer.files
  const reader = new FileReader()
  reader.readAsDataURL(files[0])
  return reader
}

onThemeChange(event: any) {
  const imageType = ['image/png', 'image/gif', 'image/jpeg']
  const file = event.target.files?.[0]
  // 先做同步校验,提前拦截不符合要求的文件
  if (!file) {
    this.errorUploadFile = true
    return
  }
  if (!imageType.includes(file.type)) {
    this.errorUploadFile = true
    return
  }
  if (file.size >= 26214400) {
    this.errorUploadFile = true
    return
  }
  // 同步校验通过后再处理宽高校验
  this.onFileInputChange(event).onload = (e: any) => {
    const image = new Image()
    // 赋值新读取到的图片DataURL
    image.src = e.target.result
    image.onload = () => {
      if (image.width > 500 && image.height > 100) {
        // 校验全部通过再替换资源
        this.upload_header = e.target.result
        console.log('图片校验通过', image.width, image.height)
      } else {
        this.errorUploadFile = true
      }
    }
    // 兜底图片加载失败的场景
    image.onerror = () => {
      this.errorUploadFile = true
    }
  }
}
逻辑说明
  • 先执行同步校验:判断文件是否存在、文件格式是否为允许的图片类型、文件大小是否小于25M,任意一项不满足直接抛出错误,终止后续逻辑。
  • 同步校验通过后,读取文件为DataURL,赋值给新创建的Image实例,加载完成后读取宽高进行校验。
  • 宽高校验通过后,再将新的DataURL赋值给this.upload_header完成资源替换,所有失败场景都统一触发错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:57:00