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

如何使用JavaScript将input选中的文件设置为img标签的src属性

报错原因

浏览器出于用户隐私安全限制,input[type=file]的value属性仅返回带C:\fakepath\前缀的虚拟路径,并非真实可访问的文件资源地址,浏览器无法识别该路径的协议规则,因此抛出ERR_UNKNOWN_URL_SCHEME错误。
同时你原有逻辑存在交互缺陷:点击图片时直接读取文件选择框的value,此时还未触发文件选择操作,也无法拿到最新选中的文件内容。

修复方案

调整交互逻辑:点击图片时主动唤起文件选择窗口,监听文件选择完成事件后,通过选中的文件对象生成合法的资源地址赋值给img标签。
下面是完整可运行的代码:

HTML 代码

<img src="" id="userImage" alt="预览图" style="cursor: pointer; width: 200px; height: 200px;">
<input type="file" id="imageInput" accept="image/*" style="display: none;">

这里将文件选择框设为隐藏,仅通过点击图片唤起,符合常规交互逻辑,accept="image/*"限制仅能选择图片类文件

JS 代码

// 点击图片唤起文件选择窗口
document.getElementById('userImage').addEventListener('click', function() {
  document.getElementById('imageInput').click()
})

// 监听文件选择完成事件,更新图片预览
document.getElementById('imageInput').addEventListener('change', function(e) {
  // 取第一个选中的文件
  const selectFile = e.target.files[0]
  if (!selectFile) return

  // 方案1:使用URL.createObjectURL 生成临时Blob链接(性能更高,适合仅当前页预览场景)
  const previewUrl = URL.createObjectURL(selectFile)
  document.getElementById('userImage').src = previewUrl

  // 可选:图片加载完成后释放临时链接内存,避免内存占用
  // document.getElementById('userImage').onload = function() {
  //   URL.revokeObjectURL(previewUrl)
  // }

  /* 方案2:使用FileReader转Base64(兼容性更好,适合需要持久化存储、上传图片的场景)
  const reader = new FileReader()
  reader.onload = function() {
    document.getElementById('userImage').src = reader.result
  }
  reader.readAsDataURL(selectFile)
  */
})

两种方案的差异说明

  • URL.createObjectURL:生成临时的Blob格式链接,生命周期和当前文档绑定,处理大图片时性能远高于转Base64,不需要时建议主动调用revokeObjectURL释放内存。
  • FileReader转Base64:生成的是Base64格式字符串,可以直接存入本地存储、提交到服务端,不需要依赖临时链接,但大图片转换后字符串体积会比原文件大1/3左右,性能相对较低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:18:04