我有一个使用应用程序缓存的离线Web应用程序.我需要为它提供大约10MB-20MB的数据,它将保存(客户端)主要由PNG图像文件组成.具体操作如下:

  1. 在appcache中下载并安装Web应用程序(使用 list )
  2. 来自服务器PNG数据文件的Web应用请求(如何?-参见下面的备选方案)
  3. 偶尔web应用程序会与服务器重新同步,并对PNG数据库进行小部分更新/删除/添加
  4. 仅供参考:SERVER是一个JSON睡觉服务器,可以将文件放在wwwroot中以供拾取

以下是我目前对处理二进制BLOB存储的基于客户端的"数据库"的分析

SEE UPDATE at Bottom

  • AppCache(通过 list 添加所有PNG,然后按需更新)

    • 缺点:对PNG数据库项的任何更改都将意味着完全下载 list 中的所有项(这真是个坏消息!)
  • WebStorage

  • 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

  • IndexedDB

  • 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

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.以及许多较老的浏览器.当我第一次写这篇文章时,情况并非如此.

推荐答案

PNG滑动贴图的脱机blob缓存结果

Testing

  • 171个PNG文件(共3.2MB)
  • 测试平台:Chrome v24、FireFox 18、IE 10
  • 还应与Chrome&;Android的FF

Fetch from web server

  • 使用XHR2(几乎所有浏览器都支持)从Web服务器下载BLOB
  • I went with XHR2-Lib by Phil Parsons, which is very much like JQUERY .ajax()

Storage

  • 用于IE和Firefox的IndexedDB
  • Chrome:PolyFill(使用文件系统API存储的BLOB,引用保存在IndexedDB中)PolyFill
  • 关于"浏览器如何存储IndexedDB数据"的必读文章
  • 注意:Firefox使用SQLlite作为NOSQL IndexedDB.这可能是表现缓慢的原因.(BLOB单独存储)
  • 注意:Microsoft IE使用可扩展存储引擎:
  • 注:Chrome使用LevelDB http://code.google.com/p/leveldb/

Display

Results

  • Chrome:Fetch(6.551s),Store(8.247s),总运行时间:(13.714s)
  • Firefox:获取(0.422s),存储(31.519s),总运行时间:(32.836s)
  • IE 10:获取(0.668s),存储:(0.896秒),总运行时间:(3.758秒)

Html相关问答推荐

弹性项在主轴方向溢出

由于列中的图像,它们不会随FlexBox中的窗口大小进行调整

如何使用css为动态用户输入矩阵添加背景色?

在iOS中调整HTML邮箱内容的大小

Div内容防止同级大小增加

如何创建带有粘性列和标题的网格?

响应网格,响应调整大小以适应父div,保留父div S自己的响应高度

我正在try 向列表中的图像添加悬停,以放大图像并将div的不透明度设置为1而不是0

HX-POST未使用正确的操作(路径)

在css中是否可以在遮罩图像中结合线性渐变和径向渐变?

希望平稳过渡到悬停状态

:invalid Select 器的惰性判断

为 HTML5 文本字段设置最后六位正则表达式模式

使单行路径的 svg 填充父级的 100% 宽度

如何在 Flex 对齐内容框下显示隐藏按钮和文本

如何清除html输入中的文本

把标题、段落和图片放在一起

使用 TailwindCSS 将徽标放在左上角,将菜单放在右上角

font awesome 的 CDN/CSS 如何工作?

HTML 标记未在页面上展开