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 |