使用data_url预览图片

一、前言

我们选择了一张图片进行上传,服务器会保存图片,然后返回给我们一个url访问地址,我们前端拿到这个url地址赋值给image元素,随后我们又要发送一个请求传递一个url给服务器,服务器再返回给我们图片数据,我们才能预览图片

从上传图片到预览图片,需要我们发送两个网络请求,我们为什么不发送一个请求,本地去处理预览呢?

因为发送网络请求,网络很好的情况下,我们的等待时间会短一些,相反来说呢,所以,传统的预览图片逻辑等待时间会比较长一些,需要发送两次请求,就比如,用户点击按钮上传之后,需要等待一段时间,才可以看到预览图,我们发现现在很多站点都是上传完之后,就可以立马看到预览图了

二、data_url

接下来,我们来实现一下图片预览

img

就比如我们上述的代码,我们需要给src赋值一个url地址,这个url就是统一资源定位符,是需要定位资源来获取资源数据的,我们如果不发送请求拿数据,我们其实可以直接将数据写进url地址里面,这时候,就要涉及data url了,data url也是一个标准格式的字符串,大家可以搜索以下链接进行阅读

https://en.wikipedia.org/wiki/Data_URI_scheme

img

我们阅读完介绍之后,我们可以明白它的组成是上面这个格式

data表示这个字符串是带有资源数据的,content/type表示资源的类型,就是通过一个字符串来表达这个资源的类型,比如我们常见的有text/htmltext/csstext/javascriptimage/pngapplication/json等等,最后一个部分就是资源的数据了

我们来尝试写一个资源的data_url

img

在上面的格式中,后面的资源是base64编码格式,我们可以利用base64将任意数据格式,通常是二进制数据,转换为对应的文本,这个过程其实就是base64编码

我们后面的alert("123"),不是base64格式啊,我们可以通过btoa函数,将alert("123")编码成base64格式

img

img

想必大家对于data_url就了解了,接下来,我们将data_url运行到图片身上

逻辑其实就是,用户点击上传图片之后,我们只需要将该图片的二进制数据在本地读出来转成base64,用base64形成data_url,最终赋值给img元素的src属性身上即可,这个时候,用户就可以立马看到预览图,不需要经过任何的网络请求

img

三、示例

我们现在需要准备两个html元素

img

inp注册change事件,来拿到读取的文件

img

我们最后,需要做的就是将文件的二进制数据读成一个data_url,怎么来读呢,我们可以创建一个文件读取器

img

读取器中有一个方法,可以帮助我们读取成data_url,但是读取是异步的,所以我们需要等待读取完成

img

我们打印一下读取结果

img

我们可以发现读取的结果就是一个data_url

接下来,我们将读取到的结果赋值给src属性身上

img

我们这样发现这样预览图片,不涉及到任何的网络通信,就可以实现快速的图片预览,提高了用户的体验

img

四、最后

本人每篇文章都是一字一句码出来,希望对大家有所帮助,多提提意见。顺手来个三连击,点赞👍收藏💖关注✨,一起加油☕

在 Vue 中使用 `window.URL.createObjectURL` 来预览图片是一个常见需求,尤其是在处理本地上传的文件或从后端获取的 Blob 数据时。该方法可以将 Blob 或 File 对象转换为一个临时的 URL,从而允许浏览器直接在 `<img>` 标签中显示图像。 以下是一个典型的实现方式: ### 图片预览实现 假设用户选择了一个本地图片文件,并希望在不上传到服务器的情况下立即预览图片。 #### HTML 模板部分 ```vue <template> <div> <input type="file" @change="previewImage" accept="image/*" /> <img :src="imagePreview" alt="预览图" v-if="imagePreview" style="max-width: 100%; margin-top: 20px;" /> </div> </template> ``` #### Vue 脚本部分 ```vue <script> export default { data() { return { imagePreview: null, }; }, methods: { previewImage(event) { const file = event.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = (e) => { this.imagePreview = e.target.result; }; reader.readAsDataURL(file); } }, }, }; </script> ``` 上述代码使用了 `FileReader` 来读取文件内容并将其转换为 Data URL,这种方式适用于小文件预览。 如果你需要通过 `window.URL.createObjectURL` 来实现相同的功能(更适用于大文件),可以修改 `previewImage` 方法如下: ```vue previewImage(event) { const file = event.target.files[0]; if (file) { const blobURL = window.URL.createObjectURL(file); this.imagePreview = blobURL; // 可选:在组件销毁前释放对象 URL 以避免内存泄漏 this.$once('hook:beforeDestroy', () => { window.URL.revokeObjectURL(blobURL); }); } } ``` 这样就可以直接通过创建的对象 URL 显示图片,而无需将整个文件数据编码为 Base64 字符串。 ### 结合 Axios 获取 Blob 数据进行预览 如果图片是从服务器获取的 Blob 数据,例如通过 Axios 请求获得,则可以参考引用[^2]中的思路: ```javascript axios.get('/api/photo', { responseType: 'blob' }).then(response => { const blob = new Blob([response.data], { type: 'image/jpeg' }); const url = window.URL.createObjectURL(blob); this.imagePreview = url; }); ``` ### 注意事项 - 使用 `window.URL.createObjectURL` 创建的链接不会自动释放,应尽量在不再需要时调用 `window.URL.revokeObjectURL()` 以释放内存。 - 如果是通过 `<input type="file">` 获取的本地文件,由于安全限制,不能直接将 `File` 对象作为 `src` 设置给 `<img>`,必须通过 `FileReader` 或 `createObjectURL` 转换后使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马甲丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值