当前位置: 首页 > news >正文

【日常记录】【JS】前端预览图片的两种方式,Base64预览和blob预览

文章目录

    • 1、前言
    • 1、FileReader
    • 3、window.URL.createObjectURL
    • 4、参考链接

1、前言

  • 一般来说,都是 后端返回给前端图片的url,前端直接把这个值插入到 img 的src 里面即可
  • 还有一种情况是前端需要预览一下图片,比如:上传头像按钮,前端需要临时 预览一下图片

这个时候就有两种方案了

  1. 方式一 转base64预览
  2. 方式二 生成blob图片预览路径url

1、FileReader

可以利用 FileReader 把文件转成 base64格式

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><input id="file1" type="file" value="FileReader.readAsDataURL 方式" multiple><script>let file1El = document.querySelector('#file1')file1El.addEventListener('change', function (e) {// 可能会上传多个文件 let files = e.target.filesconsole.log('files', files);if (files.length != 0) {loadFiles(files).then((fileContents) => {console.log(fileContents); // 在所有文件加载完成后,打印包含所有文件内容的数组fileContents.forEach(f => {let imgEl = document.createElement('img')imgEl.src = fimgEl.style.width = '100px'imgEl.style.height = '200px'document.body.appendChild(imgEl)})}).catch((error) => {console.error(error); // 处理错误情况});}})function loadFiles(files) {const promises = []for (const item of files) {promises.push(readFile(item))}return Promise.all(promises);}// 利用 promise 封装一个生成 base64的 函数,因为 onload 事件不是同步的,它需要事件处理function readFile(file) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = (event) => {const result = reader.result;if (typeof result === 'string') {resolve(result);} else {reject(new Error("Failed to read file"));}};reader.onerror = (event) => {reject(event.target.error);};// 参数file: 从中读取的 Blob 或 File 对象reader.readAsDataURL(file);});}</script></body></html>

3、window.URL.createObjectURL

window.URL.createObjectURL 方法 返回一个 url,可以直接放在 img 的src 属性上,也可以直接放在浏览器打开

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><input id="file2" type="file" value="createObjectURL 方式" multiple><script>let file2El = document.querySelector('#file2')file2El.onchange = function () {let files = file2El.filesfor (const item of files) {// 接收 File、Blob 或 MediaSource 对象。let url = window.URL.createObjectURL(item)console.log('url', url);let img = document.createElement('img')// createObjectURL 返回的格式比如:blob: http://127.0.0.1:5500/3c9e3502-1c0c-4dae-b4dc-26b68f207285img.src = urldocument.body.appendChild(img)}}</script>
</body></html>

4、参考链接

  • createObjectURL MDN
  • FileReader MDN
http://www.lryc.cn/news/359444.html

相关文章:

  • 每日刷题——杭电2156.分数矩阵和杭电2024.C语言合法标识符
  • 爬虫学习--18.反爬斗争 selenium(3)
  • 如何评价GPT-4o?
  • 算能BM1684+FPGA+AI+Camera推理边缘计算盒
  • 不同厂商SOC芯片在视频记录仪领域的应用
  • 【Python入门学习笔记】Python3超详细的入门学习笔记,非常详细(适合小白入门学习)
  • 通用代码生成器应用场景三,遗留项目反向工程
  • 轻量级动态可监控线程池 - DynamicTp
  • 对于vsc中的vue命令 vue.json
  • Spring Boot 官方不再支持 Spring Boot 的 2.x 版本!新idea如何创建java8项目
  • 分享一个 ASP.NET Web Api 上传和读取 Excel的方案
  • 【算法实战】每日一题:将某个序列中内的每个元素都设为相同的值的最短次数(差分数组解法,附概念理解以及实战操作)
  • EXCEL数据透视图中的日期字段,怎样自动分出年、季度、月的功能?
  • 【设计模式深度剖析】【1】【行为型】【模板方法模式】| 以烹饪过程为例加深理解
  • JAVA:异步任务处理类CompletableFuture让性能提升一倍
  • 10Linux 进程管理学习笔记
  • 一些关于深度聚类以及部分对比学习的论文阅读笔记
  • 【ARM-Linux篇】u-boot编译
  • Lombok一文通
  • Seq2Seq模型:详述其发展历程、深远影响与结构深度剖析
  • 公网如何访问内网?
  • 手机定制开发_基于天玑900的5G安卓手机定制方案
  • 免费,C++蓝桥杯等级考试真题--第2级
  • panic 、asset、crash 的含义和区别
  • 解决Windows 10通过SSH连接Ubuntu 20.04时的“Permission Denied”错误
  • Windows 下 PostgreSQL 图形化界面安装、配置详解
  • 曾巩,散文的艺术与哲思
  • 【SpringBoot】怎么在一个大的SpringBoot项目中创建多个小的SpringBoot项目,从而形成子父依赖
  • vue3组件通信与props
  • 并发和异步编程:详细概述