上传图片后预览图片小试

html 复制代码
<input type="file" id="file" accept="image/*" onchange="handleFileChange(event)" />
<img id="preview" src="" alt="Image Preview" />

第一种方式

直接使用 File 对象创建 Blob URL,使用URL.createObjectURL(blob)生成临时的访问地址。

js 复制代码
function handleFileChange(event) {
  const file = event.target.files[0]

  // 直接使用 File 对象创建 Blob URL
  if (file) {
    // 创建 Blob 对象
    const blob = new Blob([file], { type: file.type })

    // 生成 Blob URL 创建临时的地址
    const blobUrl = URL.createObjectURL(blob)

    // 将 Blob URL 设置为图片的 src 属性
    preview.src = blobUrl
    preview.style.display = 'block'
  }
}

第二种方式

使用 FileReader 将文件读取为 ArrayBuffer,创建 Blob URL,使用URL.createObjectURL(blob)生成临时的访问地址。

js 复制代码
function handleFileChange(event) {
  if (file) {
    const reader = new FileReader()
    reader.onload = function (e) {
      const preview = document.getElementById('preview')
      // 创建 Blob 对象,将二进制数据转换为 Blob
      const blob = new Blob([e.target.result], { type: 'image/jpeg' })

      // 生成 Blob URL
      preview.src = URL.createObjectURL(blob)
      preview.style.display = 'block'
    }
    // 转成二进制
    reader.readAsArrayBuffer(file)
  }
}

第三种方式

使用 FileReader 将文件读取为 base64,创建 Blob URL,使用URL.createObjectURL(blob)生成临时的访问地址。

js 复制代码
function handleFileChange(event) {
  if (file) {
    const reader = new FileReader()
    reader.onload = function (e) {
      const preview = document.getElementById('preview')
      preview.src = base64ToBlobUrl(base64Data)
      preview.style.display = 'block'
    }
    // 转成base64
    reader.readAsDataURL(file)
  }
}

//将base64转成Blob Url
function base64ToBlobUrl(base64Data: string | undefined) {
  if (!base64Data) {
    return ''
  }
  const base64String = base64Data.split(',')[1]

  // 解码 Base64 数据
  const binaryString = atob(base64String)
  const len = binaryString.length
  const bytes = new Uint8Array(len)

  for (let i = 0; i < len; i++) {
    bytes[i] = binaryString.charCodeAt(i)
  }

  // 创建 Blob 对象
  const blob = new Blob([bytes], { type: 'image/jpeg' })

  // 生成 Blob URL
  return URL.createObjectURL(blob)
}

最后重点,创建临时访问地址,记得要及时释放,不然会导致内存溢出。

js 复制代码
const blob = new Blob([file], { type: 'image/jpeg' })
const blobUrl = URL.createObjectURL(blob)

URL.revokeObjectURL(blobUrl)
相关推荐
陈随易4 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
福兮说5 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
传人once7 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.467 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
库拉镜像AI牛牛9 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔9 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师9 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔9 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina369 小时前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf
默_笙10 小时前
🍔 中间件不只是打日志:四个钩子、一次短路,和自带的工具
前端·javascript