我有一个使用应用程序缓存的离线Web应用程序.我需要为它提供大约10MB-20MB的数据,它将保存(客户端)主要由PNG图像文件组成.具体操作如下:
- 在appcache中下载并安装Web应用程序(使用 list )
- 来自服务器PNG数据文件的Web应用请求(如何?-参见下面的备选方案)
- 偶尔web应用程序会与服务器重新同步,并对PNG数据库进行小部分更新/删除/添加
- 仅供参考:SERVER是一个JSON睡觉服务器,可以将文件放在wwwroot中以供拾取
以下是我目前对处理二进制BLOB存储的基于客户端的"数据库"的分析
SEE UPDATE at Bottom
-
AppCache(通过 list 添加所有PNG,然后按需更新)
- 缺点:对PNG数据库项的任何更改都将意味着完全下载 list 中的所有项(这真是个坏消息!)
-
WebStorage个
- CON:专为JSON存储而设计
- 缺点:只能通过Base64编码存储BLOB(可能是由于解编码成本造成的致命缺陷)
- 缺点:WebStorage http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html的硬限制为5MB
-
PhoneGap & SQLLite
- 缺点:赞助商将拒绝该应用,因为它是需要认证的本机应用
-
ZIP file个
- 服务器创建一个zip文件,将其放置在wwwroot中,并通知客户端
- 用户必须手动解压缩(至少我是这么认为的)并保存到客户端文件系统
- Web应用程序使用文件系统API引用文件
- 缺点:zip可能太大(zip64?),创建时间很长
- 缺点:不确定文件系统API是否总是可以从沙箱中读出(我认为可以)
-
USB or SD card(回到石器时代……)
- 在脱机之前,用户将是服务器的本地用户
- 我们可以让他插入SD卡,让服务器用PNG文件填充
- 然后用户将其插入笔记本电脑、平板电脑
- Web应用程序将使用文件系统API读取文件
- 缺点:不确定文件系统API是否总是可以从沙箱中读出(我认为可以)
-
WebSQL个
- 缺点:W3C已经放弃了它(相当糟糕)
- 我可能会考虑使用IndexedDB和WebSQL作为后备的Javascript包装器
-
FileSystem API个
- Chrome支持BLOB的读写
- 缺点:不清楚IE和FireFox(IE10有非标准msSave)
- caniuse.com报告了对iOS和Android的支持(但同样,这仅仅是JSON的r/w,还是包含了用于编写的完整的blob API?
- 缺点:FireFox用户不喜欢文件系统API&;不清楚他们是否支持储蓄:https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
- PRO:根据jperf http://jsperf.com/indexeddb-vs-localstorage/15,比用于BLOB的IndexedDB快Much(第2页)
-
IndexedDB个
- 良好的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写入(当前的错误,但不清楚何时会修复)
- 更新:A June 2014 blogpost表示Chrome现在支持
IndexedDB
中的Blob - 更新:This caniuse/indexeddb确认:"Chrome 36及以下版本不支持Blob对象作为indexedDB值.";建议>;Chrome36支持Blob对象.
-
LawnChair JavaScript包装器http://brian.io/lawnchair/
- 优点:非常干净的IndexedDB、WebSQL或任何数据库包装器(想想polyfill)
- 缺点:无法存储二进制Blob,仅数据:uri(base64编码)(可能是由于反编码成本造成的致命缺陷)
-
IndexedDB JQUERY填充https://github.com/axemclion/jquery-indexeddb
- Parashuram为原始IndexedDB接口编写了一个很好的jQuery包装器
- pro:大大简化了IndexedDB的使用,我希望为Chrome FileSystemAPI添加填充/PolyFill
- 缺点:它应该可以处理斑点,但我无法使其工作
-
idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
- Eric Bidelman@Google编写了一个经过良好测试的PolyFill the FileSystem API,它使用索引数据库作为后备
- pro:文件系统API非常适合存储blob
- pro:在Firefox和Chrome上运行良好
- PRO:非常适合与基于云的CouchDB同步
- 缺点:不清楚原因,但在IE10上不起作用
-
PouchDB JavaScript库http://pouchdb.com/
- 非常适合于将CouchDB与本地数据库同步(使用WebSQL或IndexedDB(不过不是我的问题)
- CON: NO CONS, PouchDB现在支持所有最新浏览器(IE、Chrome、Firefox、手机上的Chrome等)的二进制blob.以及许多较老的浏览器.当我第一次写这篇文章时,情况并非如此.
注意:要查看PNG的数据:URI编码,我在:http://jsbin.com/ivefak/1/edit处创建了一个示例
Desired/Usefull/Uneeded Features个
- 客户端(纯Web应用程序)上没有本机(EXE、PhoneGap、ObjectiveC等)应用程序
- 只需在笔记本电脑的最新Chrome、Firefox、IE10上运行
- 我非常想要同样的Android平板电脑解决方案(iOS也不错),但只需要一个浏览器就可以工作(FF、Chrome等)
- 快速初始数据库种群
- 要求:通过web应用程序从存储器(数据库、文件)快速检索图像
- 不是针对消费者的.我们可以限制浏览器,并要求用户执行特殊的设置和任务,但让我们将其最小化
IndexedDB Implementations个
- 有一篇优秀的文章介绍了IE、FF和Chrome如何在内部实现这一点:http://www.aaron-powell.com/web/indexeddb-storage
- 简而言之:
My Current Results个
- 我 Select 使用IndexedDB方法(并使用FileSystemAPI for Chrome进行PolyFill,直到他们发布BLOB支持为止)
- 对于获取瓷砖,我遇到了一个难题,因为JQUERY人员正在考虑将其添加到AJAX中
- 我使用了Phil Parsons的XHR2-Lib,它非常类似于jQuery.ajax()https://github.com/p-m-p/xhr2-lib
- 100MB下载的性能(IE104s、Chrome 6s、Firefox 7s).
- 我无法让任何IndexedDB包装器为BLOB工作(lawnchain、PouchDB、jQuery-IndexedDB等).
- 我卷了自己的包装纸,性能是(IE102s、Chrome3s、Firefox 10s)
- 对于FF,我假设我们看到了将关系DB(Sqllite)用于非SQL存储的性能问题
- 注意,Chrome有出色的调试工具(开发人员选项卡、资源)来判断IndexedDB的状态.
FINAL Results posted below as answer个
Update
PouchDB现在支持所有最新浏览器(IE、Chrome、Firefox、手机上的Chrome等)的二进制blob.以及许多较老的浏览器.当我第一次写这篇文章时,情况并非如此.