UniApp H5端图片缓存问题(从本地加载)

1.前言

        最近自己在做一个博客类型的练习项目,因为网站没有备案无法使用cdn加速图片,所以每次进入网站时图片都加载的巨慢。因此,我想到了将图片的base64格式的数据存到本地(即浏览器)。刚开始我是用的localStorage存储数据,但是localStorage最多只能存储5M,后来我了解到还有没有存储限制的indexedDB来存储,我采用的是localforage对其进行简单的增删改查数据。

2.实现

2.1封装image组件


props: {
     //图片的线上地址 https://...
	src: {
		default: null
	  },
    //缓存到本地的Key值(键值)
	cacheSrc: {
		default: null
	  },
			
},

 //通过Key值获取图片的base64数据
  getSrc() {

		if (this.cacheSrc == null)
			return this.imageSrc = this.src

		let newSrc = this.src || null


        this.imageSrc = newSrc

		 try {
				//异步
				localforage.getItem(this.cacheSrc).then((res) => {
					
					if (res == null) 
						this.downloadImage(this.src, this.cacheSrc)
					else {
		
						   //判断一下图片是否更新,比如用户更换头像
							if(this.src !== res?.oldSrc)
                                //下载图片
								this.downloadImage(this.src, this.cacheSrc)
							else this.imageSrc = res?.data
	
					}
					}).catch((err) => {
						// 当出错时,此处代码运行
						this.downloadImage(this.src, this.cacheSrc)
						this.imageSrc = newSrc
						console.log(err);
					})

			} catch (e) {
				//TODO handle the exception
				console.log(e)
				this.imageSrc = newSrc
		}
 },

2.2下载图片并将图片转化为base64存储到本地

2.2.1下载图片
async function saveFileByH5(path, cacheData) {


	const reader = new FileReader();

	let imageBase64 = await urlToBase64(path)
	// let imageBlob =  base64ToBlob(imageBase64)
	

	let image = {
		...mode.getCacheMode(),
		...cacheData
	}
	image.data = imageBase64
    image.size = getBase64ImageSize(imageBase64)
	
	setCache(image, "文件太大无法缓存")

	return image

}
2.2.2转化为base64格式
function urlToBase64(url) {
	return new Promise((resolve) => {
		fetch(url).then(data => {
			const blob = data.blob()
			return blob;
		}).then(blob => {
			let reader = new FileReader()
			reader.onloadend = function() {
				const dataURL = reader.result
				resolve(dataURL)
			}
			reader.readAsDataURL(blob)
		})

	})
}
2.2.3缓存到本地
async function  setCache(file, message) {
	try {
		let name = file?.name || "未定义"
		

		
		//列表
		if(file?.list == true){
		
	       let listName = file?.listName || "未定义"
		   let oldData = await localforage.getItem(listName) || {}
		   oldData[name] = true
		
			 // uni.setStorageSync(name, file)
			 // uni.setStorageSync(listName, oldData)
			 
			 localforage.setItem(name,file)
			 
			 localforage.setItem(listName,oldData)
			 
			 return
			
		}
		// uni.setStorageSync(name, file)
		 localforage.setItem(name,file)
	} catch (error) {
		console.log(error)
		new Tip().error(error)
	}
}

3.效果图

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UniApp H5可以使用HTML5的canvas标签来生成图片并保存到本地。具体实现步骤如下: 1. 在H5页面中,首先需要在template中添加一个canvas标签,用于绘制图片: ``` <template> <canvas id="myCanvas"></canvas> </template> ``` 2. 在script中,获取canvas元素,并使用canvas API进行绘制。例如,绘制一张红色的矩形: ``` <script> export default { mounted() { // 获取canvas元素 const canvas = document.getElementById('myCanvas') // 获取绘图上下文 const ctx = canvas.getContext('2d') // 绘制矩形 ctx.fillStyle = 'red' ctx.fillRect(0, 0, canvas.width, canvas.height) } } </script> ``` 3. 绘制完成后,可以将canvas元素转化为图片,并保存到本地。可以使用canvas.toDataURL()方法将canvas转化为base64格式的图片数据,然后创建一个a标签并设置其href属性为图片数据,再调用a标签的click()方法触发下载。例如: ``` <script> export default { mounted() { // 获取canvas元素 const canvas = document.getElementById('myCanvas') // 获取绘图上下文 const ctx = canvas.getContext('2d') // 绘制矩形 ctx.fillStyle = 'red' ctx.fillRect(0, 0, canvas.width, canvas.height) // 将canvas转化为base64格式的图片数据 const imgData = canvas.toDataURL('image/png') // 创建a标签并设置href属性为图片数据 const link = document.createElement('a') link.href = imgData // 设置下载文件名 link.download = 'myImage.png' // 触发下载 link.click() } } </script> ``` 通过以上步骤,就可以在UniApp H5使用canvas生成图片并保存到本地了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值