139 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| const data = {
 | |
|   name: 'imgcache',
 | |
|   prefix: 'imgcache_'
 | |
| }
 | |
| function ImgCache (vm) {
 | |
|   this.vm = vm // 保存实例在其他周期使用
 | |
|   this.i = 0 // 用于标记第几张图
 | |
|   vm.imgCache = {
 | |
|     get list () {
 | |
|       return uni
 | |
|         .getStorageInfoSync()
 | |
|         .keys.filter((key) => key.startsWith(data.prefix))
 | |
|         .map((key) => key.split(data.prefix)[1])
 | |
|     },
 | |
|     get (url) {
 | |
|       return uni.getStorageSync(data.prefix + url)
 | |
|     },
 | |
|     delete (url) {
 | |
|       const path = uni.getStorageSync(data.prefix + url)
 | |
|       if (!path) return false
 | |
|       plus.io.resolveLocalFileSystemURL(path, (entry) => {
 | |
|         entry.remove()
 | |
|       })
 | |
|       uni.removeStorageSync(data.prefix + url)
 | |
|       return true
 | |
|     },
 | |
|     async add (url) {
 | |
|       const filename = await download(url)
 | |
|       if (filename) {
 | |
|         uni.setStorageSync(data.prefix + url, filename)
 | |
|         return 'file://' + plus.io.convertLocalFileSystemURL(filename)
 | |
|       }
 | |
|       return null
 | |
|     },
 | |
|     clear () {
 | |
|       uni
 | |
|         .getStorageInfoSync()
 | |
|         .keys.filter((key) => key.startsWith(data.prefix))
 | |
|         .forEach((key) => {
 | |
|           uni.removeStorageSync(key)
 | |
|         })
 | |
| 
 | |
|       plus.io.resolveLocalFileSystemURL(`_doc/${data.name}/`, (entry) => {
 | |
|         entry.removeRecursively(
 | |
|           (entry) => {
 | |
|             console.log(`${data.name}缓存删除成功`, entry)
 | |
|           },
 | |
|           (e) => {
 | |
|             console.log(`${data.name}缓存删除失败`, e)
 | |
|           }
 | |
|         )
 | |
|       })
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| // #ifdef APP-PLUS
 | |
| ImgCache.prototype.onParse = function (node, parser) {
 | |
|   // 启用本插件 && 解析图片标签 && 拥有src属性 && 是网络图片
 | |
|   if (
 | |
|     this.vm.ImgCache &&
 | |
|     node.name === 'img' &&
 | |
|     node.attrs.src &&
 | |
|     /^https?:\/\//.test(node.attrs.src)
 | |
|   ) {
 | |
|     const src = node.attrs.src
 | |
|     node.attrs.src = ''
 | |
|     node.attrs.i = this.vm.imgList.length + this.i++
 | |
|     parser.expose()
 | |
| 
 | |
|     async function getUrl (path) {
 | |
|       if (await resolveFile(path)) return path
 | |
|       const filename = await download(src)
 | |
|       filename && uni.setStorageSync(data.prefix + src, filename)
 | |
|       return filename
 | |
|     }
 | |
| 
 | |
|     uni.getStorage({
 | |
|       key: data.prefix + src,
 | |
|       success: async (res) => {
 | |
|         const path = await getUrl(res.data)
 | |
|         const url = path
 | |
|           ? 'file://' + plus.io.convertLocalFileSystemURL(path)
 | |
|           : src
 | |
|         node.attrs.src = url
 | |
|         this.vm.imgList[node.attrs.i] = path || src
 | |
|       },
 | |
|       fail: async () => {
 | |
|         const path = await getUrl()
 | |
|         const url = path
 | |
|           ? 'file://' + plus.io.convertLocalFileSystemURL(path)
 | |
|           : src
 | |
|         node.attrs.src = url
 | |
|         this.vm.imgList[node.attrs.i] = path || src
 | |
|       }
 | |
|     })
 | |
|   }
 | |
| }
 | |
| 
 | |
| const taskQueue = new Set()
 | |
| 
 | |
| function download (url) {
 | |
|   return new Promise((resolve) => {
 | |
|     if (taskQueue.has(url)) return
 | |
|     taskQueue.add(url)
 | |
|     const suffix = /.+\.(jpg|jpeg|png|bmp|gif|webp)/.exec(url)
 | |
|     const name = `${makeid(8)}_${Date.now()}${suffix ? '.' + suffix[1] : ''}`
 | |
|     const task = plus.downloader.createDownload(
 | |
|       url,
 | |
|       { filename: `_doc/${data.name}/${name}` },
 | |
|       (download, status) => {
 | |
|         taskQueue.delete(url)
 | |
|         resolve(status === 200 ? download.filename : null)
 | |
|       }
 | |
|     )
 | |
|     task.start()
 | |
|   })
 | |
| }
 | |
| 
 | |
| // 判断文件存在
 | |
| function resolveFile (url) {
 | |
|   return new Promise((resolve) => {
 | |
|     plus.io.resolveLocalFileSystemURL(url, resolve, () => resolve(null))
 | |
|   })
 | |
| }
 | |
| 
 | |
| // 生成uuid
 | |
| function makeid (length) {
 | |
|   let result = ''
 | |
|   const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
 | |
|   for (let i = 0; i < length; i++) {
 | |
|     result += characters.charAt(Math.floor(Math.random() * characters.length))
 | |
|   }
 | |
|   return result
 | |
| }
 | |
| // #endif
 | |
| 
 | |
| module.exports = ImgCache
 |