使用跨平台技术h5+实现应用图片本地缓存

在大哥王(andy)神一样的带领下,我们牛逼闪闪的走上了使用h5plus技术实现跨平台技术开发的道路,一路高歌!!!

下面我要分享的内容是如何实现图片本地缓存。


废话不说,直接看代码:




1. <span class="pun">/**</span>
2. <span class="pun">*</span><span class="pun">声明获取图片的方法</span>
3. <span class="pun">*</span><span class="lit">@param</span><span class="pun">{</span><span class="typ">Object</span><span class="pun">}</span><span class="pln"> picUrl </span><span class="pun">图片的网络地址</span>
4. <span class="pun">*</span><span class="lit">@param</span><span class="pun">{</span><span class="typ">Object</span><span class="pun">}</span><span class="pln"> defaultPic </span><span class="pun">默认图片</span>
5. <span class="pun">*</span><span class="lit">@param</span><span class="pun">{</span><span class="typ">Object</span><span class="pun">}</span><span class="pln"> element </span><span class="pun">图片源元素</span>
6. <span class="pun">*/</span>
7. <span class="kwd">function</span><span class="pln"> fetchImage</span><span class="pun">(</span><span class="pln">picUrl</span><span class="pun">,</span><span class="pln"> defaultPic</span><span class="pun">,</span><span class="pln"> element</span><span class="pun">)</span><span class="pun">{</span>
8. <span class="pun">//将图片网络地址进行</span><span class="pln">md5</span><span class="pun">摘要。</span>
9. <span class="pln"> var filename </span><span class="pun">=</span><span class="pln"> hex_md5</span><span class="pun">(</span><span class="pln">picUrl</span><span class="pun">);</span>
10. <span class="pln"> element</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"src"</span><span class="pun">,</span><span class="pln"> defaultPic</span><span class="pun">);</span>
11. <span class="pun">//尝试加载本地图片</span>
12. <span class="pln"> plus</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="pln">resolveLocalFileSystemURL</span><span class="pun">(</span><span class="str">"_downloads/"</span><span class="pun">+</span><span class="pln"> filename</span><span class="pun">,</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">entry</span><span class="pun">)</span><span class="pun">{</span>
13. <span class="pun">//</span><span class="pun">加载本地图片成功</span>
14. <span class="pln"> entry</span><span class="pun">.</span><span class="pln">file</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">file</span><span class="pun">){</span>
15. <span class="kwd">if</span><span class="pun">(</span><span class="pln">file</span><span class="pun">.</span><span class="pln">size</span><span class="pun">==</span><span class="lit">0</span><span class="pun">){</span>
16. <span class="pun">//</span><span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">"2.1图片为空显示默认"</span><span class="pun">);</span>
17. <span class="pln"> element</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"src"</span><span class="pun">,</span><span class="pln"> defaultPic</span><span class="pun">);</span>
18. <span class="pun">}</span><span class="kwd">else</span><span class="pun">{</span>
19. <span class="pln"> var path </span><span class="pun">=</span><span class="pln"> plus</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="pln">convertLocalFileSystemURL</span><span class="pun">(</span><span class="str">"_downloads/"</span><span class="pun">+</span><span class="pln"> filename</span><span class="pun">);</span>
20. <span class="pun">//</span><span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">"2.1加载本地图片"</span><span class="pun">+</span><span class="pln">path</span><span class="pun">);</span>
21. <span class="pln"> element</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"src"</span><span class="pun">,</span><span class="pln"> path</span><span class="pun">);</span>
22. <span class="pun">}</span>
23. <span class="pun">});</span>
24. <span class="pun">},</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">e</span><span class="pun">)</span><span class="pun">{</span>
25. <span class="pun">//加载本地图片失败,本地没有该图片,尝试从网络下载图片并保存本地,保存文件名为</span><span class="pln">url</span><span class="pun">摘要</span><span class="pln">md5</span><span class="pun">值</span>
26. <span class="pln"> var dtask </span><span class="pun">=</span><span class="pln"> plus</span><span class="pun">.</span><span class="pln">downloader</span><span class="pun">.</span><span class="pln">createDownload</span><span class="pun">(</span><span class="pln">picUrl</span><span class="pun">,</span><span class="pun">{</span><span class="pln">filename</span><span class="pun">:</span><span class="pln">filename</span><span class="pun">},</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">d</span><span class="pun">,</span><span class="pln"> status</span><span class="pun">)</span><span class="pun">{</span>
27. <span class="pun">//</span><span class="pun">下载完成</span>
28. <span class="kwd">if</span><span class="pun">(</span><span class="pln">status </span><span class="pun">==</span><span class="lit">200</span><span class="pun">)</span><span class="pun">{</span>
29. <span class="kwd">if</span><span class="pun">(</span><span class="pln">d</span><span class="pun">.</span><span class="pln">downloadedSize</span><span class="pun">==</span><span class="lit">0</span><span class="pun">){</span>
30. <span class="pun">//</span><span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">"2.2图片为空显示默认"</span><span class="pun">);</span>
31. <span class="pln"> element</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"src"</span><span class="pun">,</span><span class="pln"> defaultPic</span><span class="pun">);</span>
32. <span class="pun">}</span><span class="kwd">else</span><span class="pun">{</span>
33. <span class="pun">//</span><span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">"2.2下载网络文件成功"</span><span class="pun">+</span><span class="pln">d</span><span class="pun">.</span><span class="pln">url</span><span class="pun">);</span>
34. <span class="pln"> element</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"src"</span><span class="pun">,</span><span class="pln"> d</span><span class="pun">.</span><span class="pln">url</span><span class="pun">);</span>
35. <span class="pun">}</span>
36. <span class="pun">}</span>
37. <span class="pun">});</span>
38. <span class="pln"> dtask</span><span class="pun">.</span><span class="pln">start</span><span class="pun">();</span>
39. <span class="pun">});</span>
40. <span class="pun">}</span>


以上主要用到h5plus的两个重要的api

1.Downloader模块管理网络文件下载任务,用于从服务器下载各种文件,并支持跨域访问操作。


2.IO模块管理本地文件系统,用于对文件系统的目录浏览、文件的读取、文件的写入等操作。通过plus.io可获取文件系统管理对象。

详见官方:




刚开始做的时候准备使用html5的indexedDB存储图片来的,但是后来发现在移动设备上不好用。参考https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/



分享到