为离线Web应用程序存储图像数据(客户端存储数据库)

2024-01-04

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

  1. Web 应用程序下载并安装在 appcache 中(使用清单)
  2. Web 应用程序从服务器 PNG 数据文件请求(如何? - 请参阅下面的替代方案)
  3. Web 应用程序偶尔会与服务器重新同步,并对 PNG 数据库进行少量的部分更新/删除/添加
  4. 仅供参考:服务器是一个 JSON REST 服务器,可以将文件放在 wwwroot 中以供拾取

这是我当前对处理二进制 blob 存储的基于客户端的“数据库”的分析

请参阅底部的更新

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

    • 缺点:PNG 数据库项目的任何更改都意味着清单中所有项目的完整下载(真是坏消息!)
  • 网络存储

    • 缺点:专为 JSON 存储而设计
    • CON:只能通过base64编码存储blob(由于解码成本可能是致命缺陷)
    • 缺点:webStorage 硬性限制为 5MBhttp://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html
  • PhoneGap 和 SQLite

    • 缺点:赞助商将拒绝它作为需要认证的本机应用程序
  • ZIP file

    • 服务器创建一个 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 的读/写
    • CON:不清楚 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/ https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
    • PRO: Much根据 jsperf 的说法,对于 blob 来说比 IndexedDB 更快http://jsperf.com/indexeddb-vs-localstorage/15 http://jsperf.com/indexeddb-vs-localstorage/15(第2页)
  • 索引数据库

    • 对 IE10、FireFox 的良好支持(保存、读取 blob)
    • 速度快,比文件系统更容易管理(删除、更新)
    • PRO:参见速度测试:http://jsperf.com/indexeddb-vs-localstorage/15 http://jsperf.com/indexeddb-vs-localstorage/15
    • 请参阅这篇关于在 IndexedDB 中存储和显示图像的文章:https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/ https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
    • CON:我确认 Chrome 尚不支持 blob 写入(当前错误,但不清楚何时修复)
    • UPDATE: 2014 年 6 月的博文 https://developers.google.com/web/updates/2014/07/Blob-support-for-IndexedDB-landed-on-Chrome-Dev建议 Chrome 现在支持 blobIndexedDB
    • UPDATE: 这个 caniuse/indexeddb https://caniuse.com/#search=indexeddb确认:“Chrome 36 及更低版本不支持 Blob 对象作为 indexedDB 值。”;建议>Chrome36支持Blob对象。
  • 草坪椅JavaScript 包装器http://brian.io/lawnchair/ http://brian.io/lawnchair/

    • PRO:非常干净的 IndexedDB、WebSQL 或任何你拥有的数据库的包装器(想想 polyfill)
    • CON:无法存储二进制 blob,只能存储 data:uri(base64 编码)(由于解码成本可能是致命缺陷)
  • 索引数据库 JQUERY聚填充https://github.com/axemclion/jquery-indexeddb https://github.com/axemclion/jquery-indexeddb

    • Parashuram 为原始 IndexedDB 接口编写了一个很好的 JQUERY 包装器
    • PRO:极大地简化了 IndexedDB 的使用,我希望为 Chrome FileSystemAPI 添加一个 shim/polyfill
    • 缺点:它应该处理斑点,但我无法让它工作
  • idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api

    • Eric Bidelman @ Google 编写了一个经过充分测试的 PolyFill FileSystem API,它使用 Indexed DB 作为后备
    • PRO:文件系统 API 非常适合存储 blob
    • PRO: works great on FireFox and Chrome
      • PRO:非常适合与基于云的 CouchDB 同步
    • CON:不清楚原因,但它不适用于 IE10
  • PouchDBJavaScript 库http://pouchdb.com/ http://pouchdb.com/

    • 非常适合将 CouchDB 与本地数据库同步(使用 WebSQL 或 IndexedDB (但这不是我的问题)
    • 缺点:没有缺点,PouchDB 现在支持所有最新浏览器(IE、Chrome、Firefox、移动设备上的 Chrome 等)以及许多旧浏览器的二进制 blob。当我第一次发表这篇文章时情况并非如此。

注意:要查看 PNG 的 data:uri 编码,我在以下位置创建了一个示例:http://jsbin.com/ivefak/1/edit http://jsbin.com/ivefak/1/edit

所需/有用/不需要的功能

  • 客户端上没有本机(EXE、PhoneGap、ObjectiveC 等)应用程序(纯 Web 应用程序)
  • 只需要在最新的 Chrome、FireFox、IE10 笔记本电脑上运行
  • 强烈希望为 Android 平板电脑提供相同的解决方案(IOS 也不错),但只需要一种浏览器即可工作(FF、Chrome 等)
  • 快速初始数据库填充
  • 要求:通过 Web 应用程序从存储(数据库、文件)中快速检索图像
  • 不适合消费者。我们可以限制浏览器,并要求用户执行特殊的设置和任务,但让我们尽量减少这种情况

IndexedDB 实现

  • 有一篇关于 IE、FF 和 Chrome 如何在内部实现这一点的优秀文章:http://www.aaron-powell.com/web/indexeddb-storage http://www.aaron-powell.com/web/indexeddb-storage
  • In short:
    • IE 对 IndexedDB 使用与 Exchange 和 Active Directory 相同的数据库格式
    • Firefox 使用 SQLite,因此可以在 SQL 数据库中实现 NoSQL 数据库
    • Chrome(和 WebKit)正在使用具有 BigTable 传统的键/值存储

我目前的结果

  • 我选择使用 IndexedDB 方法(并使用适用于 Chrome 的 FileSystemAPI 进行填充,直到它们提供 blob 支持)
  • 为了获取图块,我陷入了困境,因为 JQUERY 人员对将其添加到 AJAX 感到不满
  • 我选择了 Phil Parsons 的 XHR2-Lib,它非常类似于 JQUERY .ajax()https://github.com/p-m-p/xhr2-lib https://github.com/p-m-p/xhr2-lib
  • 100MB 下载性能(IE10 4s、Chrome 6s、FireFox 7s)。
  • 我无法让任何 IndexedDB 包装器用于 blob(lawnchair、PouchDB、jquery-indexeddb 等)
  • 我推出了自己的包装器,性能为(IE10 2s、Chrome 3s、FireFox 10s)
  • 对于 FF,我假设我们看到使用关系数据库(sqllite)进行非 SQL 存储的性能问题
  • 注意,Chrome 具有出色的调试工具(开发人员选项卡、资源)来检查 IndexedDB 的状态。

最终结果作为答案发布在下面

Update

PouchDB 现在支持所有最新浏览器(IE、Chrome、Firefox、移动设备上的 Chrome 等)以及许多旧版浏览器的二进制 blob。当我第一次发表这篇文章时情况并非如此。


结果 PNG 滑贴图的离线 blob 缓存

Testing

  • 171 个 PNG 文件(总计 3.2MB)
  • 测试平台:Chrome v24、FireFox 18、IE 10
  • 还应该与 Android 版 Chrome 和 FF 配合使用

从网络服务器获取

  • 使用 XHR2(几乎所有浏览器都支持)从 Web 服务器下载 Blob
  • I went with XHR2-Lib by Phil Parsons, which is very much like JQUERY .ajax()
    • https://github.com/p-m-p/xhr2-lib https://github.com/p-m-p/xhr2-lib

Storage

  • 用于 IE 和 FireFox 的 IndexedDB
  • Chrome:Polyfill(使用 FileSystem API 存储的 blob,引用保存在 IndexedDB 中)polyfill
  • A Must read article on "How the browsers store IndexedDB data"
    • http://www.aaron-powell.com/web/indexeddb-storage http://www.aaron-powell.com/web/indexeddb-storage
  • 注意:FireFox 使用 SQLite 作为 NOSQL IndexedDB。这可能是性能缓慢的原因。 (斑点单独存储)
  • Note: Microsoft IE uses the extensible storage engine:
    • http://en.wikipedia.org/wiki/Extensible_Storage_Engine http://en.wikipedia.org/wiki/Extensible_Storage_Engine
  • 注意:Chrome 使用 LevelDBhttp://code.google.com/p/leveldb/ http://code.google.com/p/leveldb/

Display

  • 我正在使用传单http://leafletjs.com/ http://leafletjs.com/显示地图图块
  • I used the functional tile layer plugin by Ishmael Smyrnow for fetching the tile layer from the DB
    • https://github.com/ismyrnow/Leaflet.functiontilelayer https://github.com/ismyrnow/Leaflet.functionaltilelayer
  • 我将基于数据库的图块层与纯本地 (localhost://) 存储进行了比较
  • 性能上没有明显差异!使用 IndexedDB 和本地文件之间!

Results

  • Chrome:获取(6.551s),存储(8.247s),总运行时间:(13.714s)
  • FireFox:获取(0.422s),存储(31.519s),总运行时间:(32.836s)
  • IE 10:获取(0.668s),存储:(0.896s),总运行时间:(3.758s)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为离线Web应用程序存储图像数据(客户端存储数据库) 的相关文章

  • 导航栏折叠在 Bootstrap 中不起作用

    Bhanu pratap 解决了这个问题 在这个问题的末尾检查一下 我一直在遵循旧的路线来构建导航栏折叠 三明治 问题是课程中的页面顶部似乎有一个黑条 并且缩小页面时会出现导航栏 对我来说 我只需在左侧找到一个按钮 另外 当我缩小页面时 我
  • 根据用户区域设置过滤字符串列表

    当使用 AngularJS 1 6 处理 JavaScript 项目时 我有一个要过滤的字符串列表 例如 假设我的列表包含 rbol cig e a nido and tubo 当过滤西班牙语字符串时 如果我过滤 u 我会期望两者cig e
  • 如何仅使用CSS设置某个角的边框半径

    如上所示 我可以只给顶部部分而不给底部提供半径 或者有时给底部而不是顶部提供半径吗 有没有办法只给一个角提供边界半径 Like border radius top left top right bottom right bottom lef
  • 如何在 Java 中使用 HTML 解析器和 Apache Tika 来提取所有 HTML 标签?

    我下载了 tika core 和 tika parser 库 但找不到将 HTML 文档解析为字符串的示例代码 我必须删除网页源的所有 html 标签 我能做些什么 如何使用 Apache Tika 进行编码 您想要 html 文件的纯文本
  • 使用主宰器将实时数据发送给客户端

    我尝试使用 Flask 的主宰框架 以便按照 Flask 代码片段将实时信息发送到客户端浏览器http flask pocoo org snippets 80 http flask pocoo org snippets 80 当我尝试为我的
  • 将上部字符转换为下部字符,将下部字符转换为上部字符(反之亦然)[重复]

    这个问题在这里已经有答案了 我需要将某些字符串中的所有较低字符转换为较高字符 并将所有较高字符转换为较低字符 例如 var testString heLLoWorld 应该 HEllOwORLD 转换后 在不保存临时字符串的情况下实现此目的
  • 获取 JSON 中的 HTML 以在 React 组件中呈现为 HTML

    试图找出如何让链接实际呈现为链接 现在 在我从 Json 文件中读取这行文本后 React 将超链接渲染为文字文本 而不将其渲染为链接 一些数据 json about John has a blog you can read a href
  • 嵌套辅助函数和性能

    嵌套辅助函数对于使代码更易于理解非常有用 谷歌甚至建议在他们的应用程序中使用嵌套函数时尚指南 https google styleguide googlecode com svn trunk javascriptguide xml Nest
  • 这种 JavaScript 编码风格有什么问题? (闭包与原型)

    我们一直在讨论如何最好地处理我们的 JS 应用程序中的对象 研究 Stoyan Stefanov 的书 阅读无数关于 新 这个 原型 闭包等的 SO 帖子 事实上有很多 而且它们有这么多相互竞争的理论 表明没有完全明显的答案 让我们假设我们
  • 如何在表格的 tbody/thead 部分周围创建边框?

    我正在尝试创建一个包含表格数据的页面 该页面必须显示为多个表格 然而 我有两个相互冲突的要求需要解决 每个表格周围都必须有边框 每个表格的列宽必须能够根据内容重新调整大小 但是 所有表中的列宽必须一致 即列的大小基于所有表中该列中最大的单元
  • jQuery 在 Chrome 下发现错误元素

    我使用 jQuery 迭代 HTML 表 并动态填充每行的行号 通过在文本框中填充行号 function updateRowNums myTable find tr each function index this find input i
  • 如何使用CSS将背景图像放入选择选项标签中

    我有一个从 json 响应接收的国家 地区下拉列表 并且想要在国家 地区名称旁边添加相应的国家 地区国旗图标 也从 json 响应获取图像 我已经尝试了不同的 jQuery 和 bootstrap 插件 但他们所做的是破坏我以前的选择框样式
  • HTML5 有效的命名空间标签前缀

    验证我的页面时 W3 Validator 会给我一个错误
  • 为 Meteor 数据创建编号列表

    有没有办法获取 Meteor 集合中项目的编号列表的 编号 我知道我可以在 html 中做到这一点 但我觉得如果我可以在 spacebars 中放置一些东西 那么样式会更容易 如果我可以使用更好的术语 请告诉我 像这样的东西 前 20 部电
  • 监听浏览器宽度以进行响应式网页设计?

    我正在努力使我的网站适合移动设备 我想知道浏览器窗口的大小 以便当它比 728px 窄时我可以执行某些操作 而当它大于 728px 时我可以执行其他操作 这必须考虑到调整 PC 上的窗口大小以及在手机中从纵向模式更改为横向模式 如何才能做到
  • 为什么 document.getelementbyId 在 Firefox 中不起作用?

    我不明白为什么 document getElementById 在 Firefox 中不起作用 document getElementById main style width 100 当我检查 Firebug 时 它说 类型错误 docu
  • React + Semantic-UI:在 UI MODAL 中使用表单

    在没有 React 的普通旧 Semantic UI 中 我已经能够毫无问题地将表单放入 Modal 中 使用 Semantic UI React 版本 我能够在模态中显示表单 但它并没有按照我期望的方式工作 例如 模态框显示后 模态框内的
  • 为什么我不能在 TCPDF 表中使用 č,ć,đ 图表?

    我正在为我的网站构建一个 tcpdf 文件 该 tcpdf 文件中有一个包含一些数据的表格 但我无法使该章程正常工作 对于编码 我使用 windows 1250 宪章女巫不起作用 我已经尝试过 utf 8 但仍然没有得到这个章程 tcpdf
  • Jquery 两个字段的时间差(以小时为单位)

    我的表单中有两个字段 用户可以在其中选择输入时间 start time end time 我想在更改这些字段时重新计算另一个字段的值 我想做的是获取两次之间的小时数 例如 如果我的开始时间为 5 30 结束时间为 7 50 我想将结果 2
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma

随机推荐

  • 将 DataContext 设置为 XAML 中的当前代码隐藏对象

    我试图将 UserControl 的 DataContext 设置为 UserControl 的代码隐藏类 从代码隐藏方面来说这真的很容易做到 public partial class OHMDataPage UserControl pub
  • OnDragListener 未收到 DRAG_STARTED 或 DRAG_ENDED,但收到 ACTION_DROP

    我遇到了一个奇怪的问题OnDragListener 我的目标视图得到ACTION DROP事件正常并处理它 但它从未收到ACTION DRAG STARTED or ACTION DRAG ENDEDevents 事实上 除了 drop 之
  • SSL 证书问题 - 根据验证程序,远程证书无效

    当尝试通过 C 桌面应用程序将文件上传到我的服务器时 我收到以下错误 根据验证过程 远程证书无效 这和SSL证书有关系 这是我的网站 由 Arvixe 托管 这是我使用的代码 public void Upload string strFil
  • Delphi TWebBrowser 内存泄漏

    我的应用程序使用加载网页的 TWebBrowser 问题是 关闭包含TWebBrowser的表单后 所使用的内存没有被释放 如果我打开并关闭表单 内存就会不断增加 看到一些关于调用 SetProcessWorkingSetSize 或 Co
  • tcp 校验和和 tcp 卸载

    我正在使用原始套接字来创建我自己的套接字 我需要设置 tcp checksum 我尝试了很多参考资料 但都不起作用 我正在使用wireshark进行测试 请问你能帮帮我吗 顺便说一句 我在某处读到如果你设置 tcp checksum 0 然
  • C++ istream 运算符>> 不良数据处理

    每次我在这里问一个问题时 结果都是一些非常愚蠢的错误 如果你不相信我 请检查我的历史 所以如果可以的话请耐心等待 感觉我的问题应该很受欢迎 但我找不到任何相关信息 而且我已经没有想法可以尝试了 无论如何 事不宜迟 我正在尝试超载输入oper
  • 当“允许不太安全的应用程序:关闭”时,如何将 java 中的邮件发送到 Gmail

    我能够在 java 中将邮件发送到 gmail 当 Allow less secure apps ON 你可以找到代码here http www javatpoint com example of sending email using j
  • 使用情节提要在 Xcode 6.1.1 中展开 Segue

    我一直在读到 unwind segue 在 Xcode 6 中存在 bug 我正在使用 Xcode 6 1 1 并且使用 swift 我使用导航控制器放置的 后退 按钮 因此我无法拖动到退出图标 此外 我也无法从 viewControlle
  • 来自加德纳的拼图

    我试图在 Prolog 中解决以下难题 编号为 0 9 的 10 个单元格刻有一个 10 位数字 每个单元格 例如 i 表示数字 i 在该数字中出现的总数 找到这个号码 答案是6210001000 这是我在 Prolog 中写的 但我被卡住
  • 在画布上挥动文字

    我怎样才能在画布元素上制作类似于上找到的文本this http www pageplugins com generators crazy text textwave php page EDIT Ben 忘记对你的问题无缘无故的反对票 并且
  • UWP - 在 NavigationViewItems 上设置 IsEnabled

    我有一个 UWP 应用程序NavigationView控制 导航项是通过设置创建的MenuItemsSource在 XAML 中转换为类型的对象集合NavigationViewElement
  • 将带有 VBA 宏的 Excel 图表复制并粘贴到 Word 中

    我知道我的问题可能听起来 微不足道 但我在任何地方都找不到解决方案 而且我已经筋疲力尽了 我正在编写一个宏来自动在 Word 中生成报告 在某个阶段 我需要插入一些图表 该图表位于 Excel 的图表工作表中 但没办法 这是我的代码 Sub
  • 如何使用 FTP 命令移动文件

    源文件的路径是 public html upload 64 SomeMusic mp3 我想将它移动到这条路径 public html archive 2011 05 64 SomeMusic mp3 我如何使用 FTP 命令执行此操作 在
  • WPF:选择时为文本框添加标签

    我想创建一个看起来像视觉工作室的简单设计器 具体来说 我希望我的项目具有与 VS 中相同的行为 当未选择它们时 会显示一个简单的标签 文本块 当它们被选择时 一个文本框可以让我编辑值 实现这一目标的最佳方法是什么 谢谢 为 TextBox
  • 如何在合并排序期间“暂停”以可视化 JS p5js

    我正在使用 p5 js 开发排序可视化工具 我需要知道是否可以减慢合并排序 以便可以更慢地绘制它 我目前正在尝试使用下面的睡眠功能来减慢它们的合并功能 但我得到 未捕获的类型错误 a slice 不是函数 我只是犯了一个愚蠢的错误 还是我错
  • 模板和 while 循环

    我正在制作一个简单的模板系统 无法将代码保留在 PHP 文件中并将其输出到 html 文件中 这很烦人 在模板中包含此内容不太好 h1 h1 p p 有什么方法可以将代码保留在 PHP 文件中吗 Thanks
  • 如何修改matplotlib-venn中的字体大小

    我有以下维恩图 from matplotlib import pyplot as plt from matplotlib venn import venn3 venn3 circles set1 set A B C D set2 set B
  • 已安装的 Python 模块 - Python 找不到它们

    这是一个初学者python安装问题 这是我第一次尝试安装和调用包 我有pip安装了 我尝试安装两个模块 numpy and pandas 在终端中 我运行了以下命令 sudo pip install numpy sudo pip insta
  • 我在哪里可以获得 delphi 或 python 的免费 G​​SM 库/组件?

    我在哪里可以获得好的免费 G SM 库Delphi or Python 我可以使用哪些库在我的应用程序上发送和接收短信 Gath 免费且开源AsyncPro http sourceforge net projects tpapro gt 不
  • 为离线Web应用程序存储图像数据(客户端存储数据库)

    我有一个使用 appcaching 的离线 Web 应用程序 我需要提供大约 10MB 20MB 的数据 它将保存 客户端 主要由 PNG 图像文件组成 操作如下 Web 应用程序下载并安装在 appcache 中 使用清单 Web 应用程