微信小程序 實(shí)現(xiàn)網(wǎng)絡(luò)圖片本地緩存

在開發(fā)項(xiàng)目的過程中,微信小程序需要實(shí)現(xiàn)網(wǎng)絡(luò)圖片的本地緩存。因?yàn)閳D片大小>1M,所以用戶每次打開小程序都要重新下載,由于圖片比較大,下載時(shí)間比較久,就容易造成不好的用戶體驗(yàn)。那么,在小程序里面具體怎么實(shí)現(xiàn)圖片的緩存呢,接下來(lái)看具體實(shí)現(xiàn)代碼邏輯。
剛看到這個(gè)需求的時(shí)候,我的第一反應(yīng)是通過小程序提供的數(shù)據(jù)緩存api來(lái)實(shí)現(xiàn),

wx.setStorageSync(string key, any data)

但是api的限制就是data只能是原生類型,date,或者可以JSON序列化的對(duì)象。這樣的話就不可能把image當(dāng)成文件來(lái)存儲(chǔ)了。那么,我們?cè)趺磳?shí)現(xiàn)把image當(dāng)成一個(gè)文件來(lái)存儲(chǔ)到本地緩存呢?接下來(lái),將介紹如何使用小程序的文件系統(tǒng)來(lái)實(shí)現(xiàn)圖片的文件緩存。

// 第一步: 既然要緩存圖片,那么我們要先將圖片下載下來(lái)。
// wx.downloadFile 必填參數(shù)url: 圖片的地址。
//當(dāng)圖片下載成功以后,會(huì)返回給我們一個(gè)tempFilePath。臨時(shí)的文件路徑
//那么問題來(lái)了,這個(gè)臨時(shí)的文件路徑到底怎么理解呢?
//本地臨時(shí)文件只能通過調(diào)用特定接口產(chǎn)生,不能直接寫入內(nèi)容。本地臨時(shí)文件產(chǎn)生后,
//僅在當(dāng)前生命周期內(nèi)有效,重啟之后即不可用。因此,不可把本地臨時(shí)文件路徑存儲(chǔ)起來(lái)下次使用
//上面的是微信小程序 文檔對(duì)臨時(shí)的文件路徑的解釋。
//所以到這一步, 這個(gè)臨時(shí)的文件路徑不滿足我們的需求。那么接下來(lái)我們?cè)趺蠢眠@個(gè)臨時(shí)文件路徑實(shí)現(xiàn)本地緩存呢?
wx.downloadFile({
      url: 'xxxxxxx',
      success: function(res) {
        if (res.statusCode === 200) {
          console.log('圖片下載成功' + res.tempFilePath)
          // 第二步: 使用小程序的文件系統(tǒng),通過小程序的api獲取到全局唯一的文件管理器
          const fs = wx.getFileSystemManager()
          //  fs為全局唯一的文件管理器。那么文件管理器的作用是什么,我們可以用來(lái)做什么呢?
         //   文件管理器的作用之一就是可以根據(jù)臨時(shí)文件路徑,通過saveFile把文件保存到本地緩存.
          fs.saveFile({
            tempFilePath: res.tempFilePath, // 傳入一個(gè)臨時(shí)文件路徑
            success(res) {
              console.log('圖片緩存成功', res.savedFilePath) // res.savedFilePath 為一個(gè)本地緩存文件路徑  
              // 此時(shí)圖片本地緩存已經(jīng)完成,res.savedFilePath為本地存儲(chǔ)的路徑。
              //小程序的本地文件路徑標(biāo)準(zhǔn): {{協(xié)議名}}://文件路徑
              //協(xié)議名在 iOS/Android 客戶端為 "wxfile",在開發(fā)者工具上為 "http",
              //開發(fā)者無(wú)需關(guān)注這個(gè)差異,也不應(yīng)在代碼中去硬編碼完整文件路徑。
              //好了,到此為止,我們已經(jīng)把圖片緩存到本地了,而且我們也得到了本地緩存的路徑。
              // 那么我們把本地緩存的路徑,通過小程序的數(shù)據(jù)緩存服務(wù)保存下來(lái)。
              // 下次打開小程序 首先去緩存中檢查是否存在本地文件的緩存路徑
              // 如果有,直接image src賦值本地緩存路徑。
              //如果沒有,則是第一次下載圖片,或者用戶手動(dòng)清理緩存造成的。
              wx.setStorageSync('image_cache', res.savedFilePath)
            }
          })
        }else {
          console.log('響應(yīng)失敗', res.statusCode)
        }
      }

下面代碼是使用緩存給Image賦值的簡(jiǎn)短邏輯

/// 重新啟動(dòng)小程序,去緩存中獲取圖片的緩存地址。 然后給Imagesrc賦值
const path = wx.getStorageSync('image_cache')
    if (path != null) {
        console.log('path====', path)
        this.setData({
            image_filepath: path
        })
    }else {
       console.log('去緩存圖片')  
    }
}
    
<image src="{{image_filepath}}"></image>

接下來(lái)用一張圖片來(lái)解釋一下整體緩存思路。

wechat_cache.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容