我有一个使用appcaching的脱机Web应用程序。我需要提供大约10MB-20MB的数据(客户端),该数据主要由PNG图像文件组成。操作如下:
- Web应用程序下载并安装在appcache中(使用清单)
- 来自服务器PNG数据文件的Web应用请求(如何?-请参见下面的替代方法)
- 有时,Web应用程序会与服务器重新同步,并对PNG数据库进行少量的部分更新/删除/添加
- 仅供参考:服务器是JSON REST服务器,可以将文件放在wwwroot中以进行提取
这是我目前对处理二进制Blob存储的基于客户端的“数据库”的分析
在底部查看更新
- AppCache(通过清单添加所有PNG,然后按需更新)
- 缺点:PNG数据库项目的任何更改都意味着完整下载清单中的所有项目(真的是坏消息!)
- 网络存储
- CON:专为JSON存储而设计
- CON:只能通过base64编码存储Blob(由于解码成本高,可能是致命缺陷)
- CON:webStorage的5MB硬限制http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html
- PhoneGap和SQLLite
- 缺点:赞助商将其拒绝为需要认证的本地应用
- ZIP文件
- 服务器创建一个zip文件,将其放在wwwroot中,并通知客户端
- 用户必须手动解压缩(至少我是这样)并将其保存到客户端文件系统
- Web应用程序使用FileSystem API引用文件
- 缺点:ZIP可能太大(zip64?),创建时间很长
- 缺点:不确定FileSystem API是否可以始终从沙箱中读取(我认为是)
- USB或SD卡(回到石器时代。...)
- 用户将在离线之前位于服务器本地
- 这样我们就可以让他插入SD卡,让服务器用PNG文件填充
- 然后用户将其插入笔记本电脑,平板电脑
- Web应用程序将使用FileSystem API读取文件
- 缺点:不确定FileSystem API是否可以始终从沙箱中读取(我认为是)
- WebSQL
- 缺点:w3c放弃了它(非常糟糕)
- 我可能会考虑使用IndexedDB和WebSQL作为后备的Javascript包装器
- 文件系统API
- Chrome支持读/写Blob
- 缺点:不清楚IE和FireFox(IE10,具有非标准msSave)
- caniuse.com报告了IOS和Android支持(但同样,这仅仅是JSON的读/写,还是它包含用于编写的完整blob API?
- 缺点:FireFox员工不喜欢FileSystem API,也不清楚他们是否支持保存Blob:https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
- PRO:很多比IndexedDB的更快斑点根据jsperf http://jsperf.com/indexeddb-vs-localstorage/15(第2页)
- 索引数据库
- IE10和FireFox的良好支持(保存,读取blob)
- 比文件系统更好的速度和更轻松的管理(删除,更新)
- 专业人士:请参阅速度测试:http : //jsperf.com/indexeddb-vs-localstorage/15
- 请参阅有关在IndexedDB中存储和显示图像的文章:https ://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- 缺点:我确认Chrome浏览器尚不支持Blob写入(当前错误,但尚不清楚何时会修复)
- 更新:Chrome开发人员确认他们正在针对台式机和Android进行这项工作!尚无时间表。
- LawnChair JavaScript包装器http://brian.io/lawnchair/
- PRO:非常干净的包装器,用于IndexedDB,WebSQL或任何您拥有的数据库(想想polyfill)
- CON:不能存储二进制Blob,只能存储data:uri(base64编码)(由于解码成本高,可能是致命的缺陷)
- IndexedDB JQUERY polyFill https://github.com/axemclion/jquery-indexeddb
- Parashuram为原始IndexedDB接口编写了一个不错的JQUERY包装器
- PRO:大大简化了IndexedDB的使用,我希望为Chrome FileSystemAPI添加填充程序/填充
- 缺点:应该可以处理斑点,但是我无法使其正常工作
- idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
- Eric Bidelman @ Google编写了经过充分测试的PolyFill FileSystem API,该API使用Indexed DB作为回退
- PRO:FileSystem API非常适合存储Blob
- PRO:在FireFox和Chrome上运行出色
- PRO:非常适合与基于云的CouchDB同步
- CON:不清楚原因,但是在IE10上不起作用
- PouchDB JavaScript库http://pouchdb.com/
- 非常适合将CouchDB与本地数据库同步(使用WebSQL或IndexedDB(虽然不是我的问题)
- 缺点:没有缺点,PouchDB现在为所有最新的浏览器(IE,Chrome,Firefox,移动设备上的Chrome等)以及许多较旧的浏览器都支持二进制blob。当我第一次发表这篇文章时,情况并非如此。
注意:要查看PNG的data:uri编码,我在以下位置创建了一个示例:http : //jsbin.com/ivefak/1/edit
所需/有用的/需要的功能
- 客户端(纯Web应用程序)上没有本机(EXE,PhoneGap,ObjectiveC等)应用程序
- 只需要在最新的Chrome,FireFox,IE10笔记本电脑上运行
- 强烈希望Android平板电脑具有相同的解决方案(IOS也不错),但只需要一个浏览器即可运行(FF,Chrome等)
- 快速的初始数据库填充
- 要求:Web应用程序非常快速地从存储(数据库,文件)中检索图像
- 不适用于消费者。我们可以限制浏览器,并要求用户执行特殊的设置和任务,但是我们将其最小化
IndexedDB实现
- 关于IE,FF和Chrome如何在内部实现此功能的文章非常出色,网址为:http : //www.aaron-powell.com/web/indexeddb-storage
- 简而言之:
- IE使用与Exchange和Active Directory for IndexedDB相同的数据库格式
- Firefox使用SQLite,因此在SQL数据库中实现了NoSQL数据库
- Chrome(和WebKit)正在使用在BigTable中具有传统的键/值存储
我目前的结果
- 我选择使用IndexedDB方法(并使用适用于Chrome的FileSystemAPI进行polyfill,直到它们提供blob支持)
- 为了获取瓷砖,我遇到了困境,因为JQUERY的人们正在努力将其添加到AJAX中
- 我使用的是Phil Parsons的XHR2-Lib,它非常类似于JQUERY .ajax()https://github.com/pmp/xhr2-lib
- 100MB下载的性能(IE10 4s,Chrome 6s,FireFox 7s)。
- 我无法使用任何IndexedDB包装器来处理Blob(草地椅,PouchDB,jquery-indexeddb等)
- 我包装了自己的包装纸,性能为(IE10 2s,Chrome 3s,FireFox 10s)
- 对于FF,我假设我们正在看到将关系数据库(sqllite)用于非SQL存储的性能问题
- 注意,Chrome具有出色的调试工具(“开发人员”选项卡,资源),用于检查IndexedDB的状态。
最终结果发布在下面作为答案
更新资料
PouchDB现在为所有最新的浏览器(IE,Chrome,Firefox,移动设备上的Chrome等)以及许多较旧的浏览器支持二进制Blob。当我第一次发表这篇文章时,情况并非如此。