小程序实现本地图片缓存功能

公司最近有个需求,就是我们的小程序的详情页一点开就是好几十张图片,特别浪费流量,而且不够快。于是就想,能不能把上次加载的图片存在本地,等下次打开的时候直接加载本地图片就可以了?

事实证明是可行的。

新建一个upImg.js文件,把所有的功能都写在里面。


const fs = wx.getFileSystemManager();

//入口方法
function chekcimgstorsize(warrantyId, data) {
    return new Promise((resolve, reject) => {
        let imgStor = wx.getStorageSync('imgStor') || [];
        let aIndex = imgStor.findIndex((item) => {
            return item.warrantyId == warrantyId;
        })
        if (aIndex == -1) { //没找到
            resolve(data);
            isOver(data).then((res) => {
                let imgStor = wx.getStorageSync('imgStor') || [];
                imgStor.push({
                    warrantyId: warrantyId,
                    data: res
                });
                wx.setStorageSync("imgStor", imgStor);
            })
        } else { //找到了
            console.log("我是有缓存了");
            if(imgStor[aIndex].data){   
                let data2 = imgStor[aIndex].data;
                let data1 = JSON.parse(JSON.stringify(data));
                for(let i=0;i<data2.length;i++){
                    for(let j=0;j<data1.length;j++){
                        if(data2[i].detectId === data1[j].detectId && data2[i].imgurl === data1[j].imgurl){
                            data1[j].imgurl = data2[i].ImgSave;
                            data1[j].isSave = 1;
                        }
                    }
                }
                resolve(data1);
                let additionalArr = data1.filter((item)=>{
                    return !item.isSave && item.imgurl
                })
                if(additionalArr.length>0){
                    downloadImg(additionalArr).then((res)=>{
                        let bimgStor = wx.getStorageSync('imgStor') || [];
                        let bIndex = imgStor.findIndex((item) => {
                            return item.warrantyId == warrantyId;
                        })
                        for(let k = 0;k<res.length;k++){
                            bimgStor[bIndex].data.push(res[k])
                        }
                        wx.setStorageSync("imgStor", bimgStor);
                    }) 
                }          
            }else{
                console.log("没下载完就退了,缓存里没有!")
            }
        }
    })
}


// 先看缓存是否快满了,快满了去删;不然去下载
function isOver(data) {
    return new Promise((resolve, reject) => {
        fs.getSavedFileList({
            success(res) {
                res = res.fileList;
                let size = 0;
                for (let index = 0; index < res.length; index++) {
                    size += res[index].size;
                }
                size = size / 1048576; //字节转成MB
                console.log(size);
                if (size > 170) {
                    delimgstor(res, data).then((res)=>{
                        resolve(res);
                    })
                } else {
                    let data2 = data.filter((item) => {
                        return item.imgurl
                    })
                    downloadImg(data2).then((res => { //去下载
                        resolve(res);
                    }))
                }
            }
        })
    })
}

// 删除前四分之一
function delimgstor(res, data) {
    let bimgStor = wx.getStorageSync('imgStor') || [];
    let num = Math.floor(bimgStor.length / 4);
    let promiseList = []
    return new Promise((resolve, reject) => {
        for(let i = 0; i < num; i++){
            for(let j = 0;j<bimgStor[i].data.length;j++){
                promiseList.push(new Promise((resol, reje) => {
                    fs.removeSavedFile({
                        filePath: bimgStor[i].data[j].ImgSave,
                        success(res) {
                            resol(i)
                            console.log(res, 'rrrr')
                        },
                        fail(res) {
                            console.log(res, 'eeee')
                            resol(i)
                        }
                    })
                }))
            }
        }
        Promise.all(promiseList).then((res) => {
            let delarr = unique(res);
            let cimgStor = wx.getStorageSync('imgStor') || [];
            for(let i=0;i<delarr.length;i++){
                cimgStor.splice(i,1)
            }
            wx.setStorageSync("imgStor", cimgStor);
            downloadImg(data).then((ress => {
                resolve(ress);
            }))
        })
    })
}
function unique (arr) {
    return Array.from(new Set(arr))
}
// 下载图片
async function downloadImg(data) { 
        let arr = [];
        let data2 = data.filter((item)=>{
            return item.imgurl
        })
        for (let i = 0; i < data2.length; i++) {
            let imgs =  await downloadImg2(data2[i]);
            arr.push(imgs)
        }
        console.log("下载全部执行完毕了~!~~~~~!!!!!!");
        return arr      
}

function downloadImg2(item){
    var p = new Promise(function (resolve, reject) {
        console.log("我要开始下载了");
        wx.downloadFile({
            url: item.imgurl+'?size=s',
            success: function (res) {
                if (res.statusCode === 200) {
                    fs.saveFile({
                        tempFilePath: res.tempFilePath,
                        success(r) {
                            let obj = {
                                detectId: item.detectId,
                                imgurl: item.imgurl,
                                ImgSave:r.savedFilePath
                            } 
                            resolve(obj)
                        }
                    })
                }
            }
        })
    })
    return p
}


module.exports = {
    chekcimgstorsize
}

然后在需要调用的地方

  getImgData() {
        util.get(api.xxx, { }).then(async (res)=>{
                try{
                    truck1 = await upImg.chekcimgstorsize(this.data.warrantyId, truck1);
                }
                catch{
                    console.log("缓存的方法报错了~"); 
                }
  }))

整体思路是,根据详情页的id去localstorage里找,如果没有,则直接返回网络路径,同时下载,下载完成后存在本地(最大只能存200M,如果到170则删除最前面的四分之一)。这里的下载是文件,和localstorage是两个东西,localstorage存的是id和数据。如果找到了则返回本地存的路径。如果出错了也要处理一下。

<image src="{{item.imgurl}}" wx:if="{{item.isSave == 1 }}" binderror="imgErrorss" class="up_smimg" mode="aspectFit" data-img="{{item.imgurl2}}" data-index="{{index}}"></image>
                    <image src="{{item.imgurl}}?size=s" wx:else class="up_smimg" data-img="{{item.imgurl2}}" data-index="{{index}}" mode="aspectFit"></image>
imgErrorss(e){
      let truck1 = this.data.truck1;
      truck1[e.currentTarget.dataset.index].imgurl= e.currentTarget.dataset.img
      this.setData({ truck1 })
    },

大概这样。还没经过我们组的一个专业测试进行测过,可能会有bug。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信平台的在线漫画阅读小程序是一个为漫迷们提供的专门用于浏览和阅读各种漫画作品的应用程序。该小程序利用微信平台广泛的用户基础和强大的社交功能,为用户提供了一个便捷的在线阅读环境。这个小程序通常包含以下几个主要特点:用户界面友好:设计简洁直观,方便用户快速找到想看的漫画,并提供舒适的阅读体验。多样化内容:涵盖多种类型的漫画,如冒险、科幻、爱情、悬疑等,以满足不同用户的喜好。实时更新:漫画内容保持与出版同步更新,确保用户能够及时阅读到最新章节。个性化推荐:根据用户的阅读历史和偏好,智能推荐漫画,帮助用户发现可能感兴趣的新作品。社交互动功能:用户可以评论、分享喜欢的漫画到朋友圈,或与朋友讨论漫画内容,增强社交体验。离线阅读:支持下载漫画至本地存储,让用户在没有网络的情况下也能继续阅读。多语言支持:根据用户需求,可能会提供中文之外的其他语言选项,以吸引和服务更广泛的用户群体。订阅机制:用户可以选择订阅喜欢的漫画系列,以便不错过任何更新。付费模式:某些高级功能或独家内容可能需要通过内购的方式进行解锁。小程序实现通常涉及前端开发(使用微信小程序框架)、后端服务(可能包括数据库管理、服务器端逻辑处理等)以及与微信平台的接口对接,以确保符合微信生态的规则和标准。此外,为了提升用户体验,还会涉及到图片优化、数据缓存策略、网络请求优化等技术细节。总之,综上所述,基于微信平台的在线漫画阅读小程序旨在提供一个内容丰富、操作便捷、社交性强的移动漫画阅读平台,满足现代移动互联网用户的需求,并充分利用微信生态的优势来增强用户粘性和活跃度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值