前端预览图片的两种方式:转Base64预览或转本地blob的URL预览

预览图片

  • 一般情况下,预览图片功能,是后端返回一个图片地址资源(字符串)给前端,如:ashuai.work/static/img/...
  • 前端再把这个值丢到img图片的src属性中去即可
  • 之所以有这个图片地址资源,也是因为之前有上传图片的操作,后端存到文件服务器上,生成一份图片url地址
  • 但是某些情况下,需要前端去临时预览一下图片(是否上传是后续的操作,需要先看一下)
  • 这个时候,我们有两种方案
  • 方式一 转base64预览
  • 方式二 生成blob图片预览路径url

方案一 FileReader的readAsDataURL方法

复制粘贴即演示

代码如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <input type="file" id="fileInput">
    <img id="previewImage" src="" alt="Preview Image">
    <script>
        const fileInput = document.getElementById('fileInput');
        const previewImage = document.getElementById('previewImage');
        fileInput.addEventListener('change', function () {
            const file = fileInput.files[0];
            const reader = new FileReader();
            reader.onload = function (e) {
                const base64String = e.target.result;
                previewImage.src = base64String;
                console.log('图片读取的Base64的值为--->', base64String);
            };
            reader.readAsDataURL(file);
        });
    </script>
</body>
</html>

解析:

  • FileReader 之所以能读出图片的 Base64 的值
  • 是因为 readAsDataURL 方法本身就可以将图片的二进制数据转化为 Base64 编码
  • 并将编码后的字符串以 Data URL 的形式返回以供使用

就是语言的创造者提前把这个图片转Base64的功能封装成一个方法以供我们调用

方案二 URL.createObjectURL方法

  • createObjectURL是JS自带的一个函数,它可以将Blob、File等二进制文件转为浏览器可直接显示的URL地址,从而方便进行展示

代码如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <input type="file" id="fileInput">
    <img id="previewImage" src="" alt="Preview Image">
    <script>
        const fileInput = document.getElementById('fileInput');
        const previewImage = document.getElementById('previewImage');
        fileInput.addEventListener('change', function () {
            const file = fileInput.files[0];
            let tempUrl = window.URL.createObjectURL(file)
            console.log('blob--->', tempUrl); // blob:http://127.0.0.1:5500/84d2e951-33dc-4fea-840a-f3d8f3396766
            previewImage.src = tempUrl;
        });
    </script>
</body>
</html>

A good memory is better than a bad pen. Write it down...

相关推荐
长风清留扬35 分钟前
小程序毕业设计-音乐播放器+源码(可播放)下载即用
javascript·小程序·毕业设计·课程设计·毕设·音乐播放器
m0_748247801 小时前
Flutter Intl包使用指南:实现国际化和本地化
前端·javascript·flutter
ZJ_.1 小时前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
joan_852 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
还是大剑师兰特2 小时前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用
Watermelo6173 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
一个处女座的程序猿O(∩_∩)O5 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
燃先生._.11 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖12 小时前
[react]searchParams转普通对象
开发语言·前端·javascript