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

使用File Reader上传文件后Canvas显示图片失败求助

问题解决:FileReader加载图片到Canvas不显示的问题

你的代码核心问题是图片加载事件名拼写错误:JavaScript的事件名是大小写敏感的,你写的tempImageStore.onLoad应该改为tempImageStore.onload(注意load全小写)。这个错误导致图片加载完成后,绘制Canvas的回调函数根本没执行,所以上传后Canvas没显示图片,也不会有控制台报错(因为只是绑定了一个不存在的事件,浏览器不会抛出错误)。

修正后的完整代码如下:

var canvas = document.getElementById("ourCanvas"),
context = canvas.getContext('2d'),
uploadedFile = document.getElementById('uploaded-file');

window.addEventListener('DOMContentLoaded', initImageLoader);

function initImageLoader() {
  uploadedFile.addEventListener('change', handleManualUploadedFiles);
  function handleManualUploadedFiles(ev){
    var file = ev.target.files[0];
    handleFile(file);
  }
}

function handleFile(file) {
  var imageType = /image.*/;

  if(file.type.match(imageType)){
    var reader = new FileReader();

    reader.onloadend = function(event) {
      var tempImageStore = new Image();

      // 修正事件名为onload(全小写)
      tempImageStore.onload = function(ev){
        canvas.height = ev.target.height;
        canvas.width = ev.target.width;
        context.drawImage(ev.target, 0, 0);
      }
      tempImageStore.src = event.target.result;
    }

    reader.readAsDataURL(file);
  }
}

额外注意点:

  • 确保你的HTML中存在id为ourCanvas的<canvas>元素,以及id为uploaded-file的<input type="file">元素
  • 如果需要限制Canvas的最大尺寸(避免图片过大撑爆页面),可以在绘制时按比例缩放,比如:
    tempImageStore.onload = function(ev){
      const maxSize = 800;
      let width = ev.target.width;
      let height = ev.target.height;
      if(width > maxSize || height > maxSize){
        const ratio = Math.min(maxSize/width, maxSize/height);
        width *= ratio;
        height *= ratio;
      }
      canvas.width = width;
      canvas.height = height;
      context.drawImage(ev.target, 0, 0, width, height);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:05:13