网络图片转化成base64

也许今天比较无聊,突然想前端怎么把图片缓存的本地?如果是数据流,直接保存到localStorage,但是如果是网络url地址怎么办?存个url肯定没有什么意义,苦思冥想还是把图片保存为base64格式,这又遇到了问题,怎么才能把url转成base64呢?于是就想到了canvas

react为例,首先接口获取数据,在取到数据后,先判断有没有缓存,如果有就取缓存中的数据,如果没有,则使用canvas将其转化成base64存储就可以了。为了方便操作,在localStorage存储中添加了一个更新时间,如果想更新缓存可以改变时间就可以了,其次用url当key值,主要是为了方便取用。

import React, { useState, useEffect } from 'react'
const CacheImg = () => {let [imgURL, setImgURL] = useState('')useEffect(() => {getData()}, [])const getData = () => {new Promise(resolve => {// 这里模仿接口发送异步请求let data = {updateTime: '2023-11-09 12:00:00',url: 'https://web-assets.dcloud.net.cn/unidoc/zh/shuijiao-small.jpg'}resolve(data)}).then(res => {let localData = JSON.parse(localStorage.getItem('cacheUrls')) || {}// 先获取本地存储的数据,当更新时间和url都一样时,就取缓存数据if (localData.updateTime === res.updateTime && localData[res.url]) {setImgURL(localData[res.url])} else {let canvas = document.createElement('canvas')let ctx = canvas.getContext('2d')let image = new Image()// 解决图片跨域image.crossOrigin = 'Anonymous'image.src = res.urlimage.onload = () => {canvas.width = image.widthcanvas.height = image.height// 绘制图片-在左上角的位置ctx.drawImage(image, 0, 0)// 存个更新时间,方便更新let cacheObj = {updateTime: res.updateTime,// 'https://web-assets.dcloud.net.cn/unidoc/zh/shuijiao-small.jpg': ''}// 返回值是一个数据url,是base64组成的图片的源数据cacheObj[res.url] = canvas.toDataURL('image/png')// 本地存储localStorage.setItem('cacheUrls', JSON.stringify(cacheObj))setImgURL(cacheObj[res.url])// 清空canvascanvas = null}}})}return <div>{imgURL ? <img src={imgURL} /> : ''}</div>
}export default CacheImg

看一下network,只有第一次会加载图片,其他情况都会取缓存中的,大大的节约了获取图片的时间,你也许会说,浏览器本身就带缓存,可是,在开发中,有时候会开启无缓存模式,这个时候对一成不变的图片还每次都加载,岂不是浪费时间?即便关了浏览器、关了电脑再打开也不会在去请求url。

image.png

为了防止保存很多无用的图片,可以给localStorage设置一个过期时间,虽然localStorage 本身没有提供设置有效期的方法,但我们可以自己封装个方法来实现。

例如这样:

Storage.prototype.setExpire = (key, value, expire) => {let obj = {data: value,time: Date.now(),expire: expire,}//localStorage 设置的值不能为对象,转为json字符串localStorage.setItem(key, JSON.stringify(obj))
};
Storage.prototype.getExpire = (key) => {let val = localStorage.getItem(key)if (!val) {return val}val = JSON.parse(val)if (Date.now() - val.time > val.expire) {localStorage.removeItem(key)return null}return val.data
};
  • 获取数据
let storage = localStorage.getExpire(`cacheUrls`)
  • 设置数据
// 有效期七天
localStorage.setExpire(`cacheUrls`, vals, 86400000 * 7);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MDK ARM环境下的伪指令的测试

目录 测试目标&#xff1a; 测试代码&#xff1a; 1. start.s 2. align.s 测试结果&#xff1a; 1 .ldr伪指令的测试结果: 2 .align伪操作测试结果: 结果分析&#xff1a; 测试目标&#xff1a; 熟悉ARM处理器的伪指令&#xff0c;本次实验主要来练习ldr伪指令和align…

你不得不知道的工业镜头使用中的常见问题

镜头的基本功能就是实现光束变换&#xff08;调制&#xff09;&#xff0c;在机器视觉系统中&#xff0c;工业镜头的主要作用是将目标成像在图像传感器的光敏面上。工业镜头是机器视觉系统设计的重要环节。在实际应用过程中&#xff0c;会遇到以下常见问题。 1、Q&#xff1a;…

力扣543. 二叉树的直径(java DFS解法)

Problem: 543. 二叉树的直径 文章目录 题目描述思路解题方法复杂度Code 题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们…

OGG实现Oracle19C到postgreSQL14的实时同步

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

用户帐户限制(例如,时间限制)会阳止你登录。请与系统管理员或技术支持联系以获取帮助

出现的问题 用户帐户限制(例如&#xff0c;时间限制)会阳止你登录。请与系统管理员或技术支持联系以获取帮助 2.解决方法 使用WINR召唤出运行&#xff0c;然后输入secpol.msc,然后点击回车键&#xff0c;进入本地安全策略&#xff0c;在左边栏中找到本地策略&#xff0c;再…

TextCNN文本分类快速上手

这里写目录标题 TextCNN介绍&#xff1a;Docker从0安装Docker基于镜像安装容器打包操作&#xff08;生成镜像时使用的命令&#xff09;安装时命令 页面访问模型训练API访问性能测试其他查看显卡信息 TextCNN介绍&#xff1a; 1.支持语义识别和分类置信度输出。 2.训练速度快&…

在动态时代引领软件领导地位

在职业追求领域&#xff0c;存在一种常见的误解&#xff0c;认为管理软件开发类似于骑自行车——一种静态技能&#xff0c;一旦获得&#xff0c;只需极少的调整就可以平稳地向前推进。然而&#xff0c;在快速发展的技术领域&#xff0c;这种比较不仅过于简单化&#xff0c;而且…

如何设计适合数字化转型需要的数据架构

现代组织需要一个模块化的数据架构来支持复杂的企业环境&#xff0c;同时为业务用户提供数据访问。以下是一些关键考虑因素。 一重视元数据的管理 数据架构不断发展以提供由元数据支持的数据自助服务 过去几十年来&#xff0c;数据分析架构最佳实践已经经历了多个时代&#…

linux服务器环境搭建(使用yum 安装mysql、jdk、redis)

一:yum的安装 1:下载yum安装包并解压 wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz tar xvf yum-3.2.28.tar.gz 2.进入yum-3.2.28文件夹中进行安装,执行安装指令 cd yum-3.2.28 sudo apt install yum 3.更新版本 yum check-update yum update yum cle…

基于微博的信息热度评价与预测分析

摘 要 微博已成为时下非常热门的社交媒体平台&#xff0c;是一个庞大的关于信息分享和话题交流的平台&#xff0c;在人们线上社交活动中发挥着不可替代的作用&#xff0c;由于网络信息鱼龙混杂&#xff0c;所以本文通过了解微博的热度机制进而研究微博热度和预测微博的热门程度…

WebGL开发数据可视化应用

WebGL 是一种强大的图形渲染技术&#xff0c;用于在浏览器中创建高性能的交互式数据可视化应用。以下是开发这类应用的一般技术方案&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.WebGL 框架&…

CRM实战:如何对商机阶段进行有效管理

对企业来说&#xff0c;管理客户的多个需求对于开发新的商机至关重要。一旦发现客户有多个需求&#xff0c;我们可以在客户信息表中建立相应数量的商机&#xff0c;这样有助于系统化地进行跟进&#xff0c;达到商机利用的最大化。那么&#xff0c;CRM系统如何进行企业的商机阶段…

C语言二叉树的基本概念(一)

目录 二叉树 二叉树的分类&#xff08;目前只谈两种&#xff09; 满二叉树 完全二叉树 二叉树的性质&#xff08;其余的可以自己总结&#xff09; 选择练习 二叉树的存储结构 顺序存储方式 链式存储方式 二叉树 定义&#xff1a;二叉树是一种特殊的树状数据结构&…

前端漏洞--front(系统有user1/user1,admin1/admin1两个用户)

任务一&#xff1a;挖掘反射型XSS漏洞&#xff08;以弹窗test13&#xff09;证明 任务二&#xff1a;复现环境中的CSRF漏洞&#xff0c;设计表单&#xff0c;当管理员点击URL后自动将自己密码重置为&#xff1a;123456 任务三&#xff1a;复现环境中的JSON Hijacking漏洞&#…

电容、电感和电阻

一、电感 1&#xff09;图片 2&#xff09;作用 a&#xff09;储存容量 例如dcdc转换器的原理,将一个电压值转换成另外一个电压值 b&#xff09;选择信号 比如空气中弥漫着很多信号&#xff0c;我们应该怎么选取我们所需要的信号。 电感和电容可以看成一个电阻&#xff0c;当电…

CRM管理系统:让你的业务运行更流畅

是客户关系管理系统的缩写。现代企业利用网络技术协调企业和客户之间在销售和服务上的对接&#xff0c;提升企业核心竞争力的一种手段。那么CRM管理系统一般包含哪些功能模块呢&#xff1f;今天小编为大家介绍一下。 一、好的CRM管理系统有哪些功能特性 1、有全方位的客户视图…

2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④

2024年甘肃省职业院校技能大赛&#xff08;中职教师组&#xff09;网络安全竞赛样题卷④ 2024年甘肃省职业院校技能大赛&#xff08;中职教师组&#xff09;网络安全竞赛样题卷④A模块基础设施设置/安全加固&#xff08;本模块200分&#xff09;A-1任务一 登录安全加固&#xf…

Stable diffusion ai图像生成本地部署教程

前言 本文将用最干最简单的方式告诉你怎么将Stable Diffusion AI图像生成软件部署到你的本地环境 关于Stable Diffusion的实现原理和训练微调请看我其他文章 部署Stable Diffusion主要分为三个部分 下载模型&#xff08;模型可以认为是被训练好的&#xff0c;生成图像的大脑…

如何有效进行主数据治理

在企业信息化建设不断推进、逐渐进行数字化转型的今天&#xff0c;几乎所有的企业都卷入到数据及其处理&#xff08;数据收集、存储、检索、传输、分析和表示&#xff09;的浪潮中&#xff0c;数据已成为重要生产要素和无形资产&#xff0c;针对主数据的全生命周期管理迫在眉睫…

振弦读数模块开发时的要点

振弦读数模块开发时的要点 振弦读数模块是振弦采集仪中重要的组成部分&#xff0c;以下是开发时需要注意的要点&#xff1a; 1. 确定采样频率和精度&#xff1a;振弦采集仪必须以足够高的频率和精度采集振弦信号&#xff0c;以确保数据的准确性和完整性。 2. 选择合适的传感器…