HTML5 本地存储初探
来源:互联网 发布:中控xu500怎么导出数据 编辑:程序博客网 时间:2024/04/19 22:40
随着html5本地存储的到来,web应用也会更加充满活力。下面是个人对html5本地存储的一些理解。
客户端持久化数据的历史:
HTTP cookie: 这个是客户端使用的最为通用的方式,但问题也很明显。典型情景是用户本想执行一个事务,但可能会因为cookie而在不同窗口中执行多个事务。例如,一个用户在两个不同的窗口中登录同一个网站购买机票。网站使用cookie来记录用户购买的车票,当用户在不同窗口之间点击时,cookie可能会导致用户为同一个航班购买两张机票。另外,cookie最多只能存储4KB数据,每个HTTP请求都要将其送回服务器。
我们真正想要的是:
更大的存储空间
客户端持久化
不受页面刷新的影响
不需要提交到服务器
HTML5本地存储:
Web Storage是目前支持最广泛的HTML5本地存储规范,几乎所有浏览器都支持。
浏览器通过实现localStorage等接口来支持webStorage。它让 web 页面能够以键值对的形式,在客户端web浏览器中将数据存储在本地的方法。就像 cookie 一样,这种数据在你离开 web 站点、关闭标签页、退出浏览器等等的时候依然保存。不同于 cookie 的地方是,这个数据不会被发送到远程 web 服务器(除非你自己手动发送)。
其使用非常简单:
var foo = "hello,localStorage";localStorage.setItem("hello",foo);var message = localStorage.getItem("hello");
通过注册“storage”事件可以感知数据值的变化。
window.addEventListener('storage', function(e) { console.log(e.key + "'s value is changed from '" + e.oldValue + "' to '" + e.newValue + "' by " + e.url);}, false);//A pagelocalStorage['foo'] = 'bar';//B pagelocalStorage['foo'] = 'newBar'
FileSystem API
当我们不满足于键-值形式的本地存储,而是想要自己管理本地存储;或者觉得数据库的支持不够好,想拥有一个本地文件系统一样时,可能要考虑FileSystem API了。目前,只有chrome浏览器支持该特性。使用FileSystem API,web应用可以创建、读写、遍历存在于沙箱(sandbox)中的用户本地文件系统的子集。
典型的好处如下:
1. 持久上传
- 当文件或者目录被选择上传时,数据被拷贝到本地沙箱中,并且一次上传一部分。
- 可以在浏览器崩溃或者网络故障后重新启动上传。
2. 视频游戏等拥有大量多媒体资源的应用
- 下载压缩包,本地解压成目录结构。
- 下载与操作系统无关
- 支持预取策略,从而使体验更加流畅。
- 服务器端更加节省存储。
3. 音频、图片离线编辑、缓存加速
- 目录结构更加适合于该类型文件的组织。
- 被其他应用如iTunes、Picasa离线编辑
4. 离线视频观看
- 为后续的观看下载超过1GB的大文件。
- 方便快速seek播放
- 部分播放,不用video标签全部加载
5. 离线web 邮件客户端
- 下载附件,本地存储。
- 缓存用户选择的附件以便快速上传。
- 上传时可以作为多部分的post,而不是一次一个XHR里面的文件。
FileSystem API 代码示例,需要chrome以--unlimited-quota-for-files标志运行,或者chrome web app 的manifest中开启unlimitedStorage权限
<!DOCTYPE html><html> <head> <style> .example { padding: 10px; border: 1px solid #CCC; } #example-list-fs ul { padding-left: 0; } #example-list-fs li { list-style: none; } #example-list-fs img { vertical-align: middle; } button { padding: 5px 8px; cursor: pointer; text-shadow: 1px 1px white; font-weight: 700; font-size: 10pt; } body { font: 14px Arial; } </style> </head> <body> <div id="example-list-fs" class="example"> <button>Add some files</button> <button>List files</button> <button>Remove all files</button> <ul id="example-list-fs-ul"></ul> </div> <script> window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; var fs = null; function errorHandler(e) { var msg = ''; switch (e.code) { case FileError.QUOTA_EXCEEDED_ERR: msg = 'QUOTA_EXCEEDED_ERR'; break; case FileError.NOT_FOUND_ERR: msg = 'NOT_FOUND_ERR'; break; case FileError.SECURITY_ERR: msg = 'SECURITY_ERR'; break; case FileError.INVALID_MODIFICATION_ERR: msg = 'INVALID_MODIFICATION_ERR'; break; case FileError.INVALID_STATE_ERR: msg = 'INVALID_STATE_ERR'; break; default: msg = 'Unknown Error'; break; }; document.querySelector('#example-list-fs-ul').innerHTML = 'Error: ' + msg; } function initFS() { window.requestFileSystem(window.TEMPORARY, 1024*1024, function(filesystem) { fs = filesystem; }, errorHandler); } var buttons = document.querySelectorAll('#example-list-fs button'); var filelist = document.querySelector('#example-list-fs-ul'); if (buttons.length >= 3) { buttons[0].addEventListener('click', function(e) { if (!fs) { return; } fs.root.getFile('log.txt', {create: true}, null, errorHandler); fs.root.getFile('song.mp3', {create: true}, null, errorHandler); fs.root.getDirectory('mypictures', {create: true}, null, errorHandler); filelist.innerHTML = 'Files created.'; }, false); buttons[1].addEventListener('click', function(e) { if (!fs) { return; } var dirReader = fs.root.createReader(); dirReader.readEntries(function(entries) { if (!entries.length) { filelist.innerHTML = 'Filesystem is empty.'; } else { filelist.innerHTML = ''; } var fragment = document.createDocumentFragment(); for (var i = 0, entry; entry = entries[i]; ++i) { var img = entry.isDirectory ? '<img src="http://www.html5rocks.com/static/images/icon-folder.gif">' : '<img src="http://www.html5rocks.com/static/images/icon-file.gif">'; var li = document.createElement('li'); li.innerHTML = [img, '<span>', entry.name, '</span>'].join(''); fragment.appendChild(li); } filelist.appendChild(fragment); }, errorHandler); }, false); buttons[2].addEventListener('click', function(e) { if (!fs) { return; } var dirReader = fs.root.createReader(); dirReader.readEntries(function(entries) { for (var i = 0, entry; entry = entries[i]; ++i) { if (entry.isDirectory) { entry.removeRecursively(function() {}, errorHandler); } else { entry.remove(function() {}, errorHandler); } } filelist.innerHTML = 'Directory emptied.'; }, errorHandler); }, false); } // Initiate filesystem on page load. if (window.requestFileSystem) { initFS(); } </script> </body></html>
综上,HTML5的本地存储特性,将会给未来的web应用带来更丰富的特性,从而大幅提升用户体验。
参考资料:
http://www.html5rocks.com/en/tutorials/file/filesystem/#toc-introduction
http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#introduction
http://dev.w3.org/html5/webstorage/#introduction
http://www.devbean.info/2011/06/dive-into-html5-localstorage/
- HTML5 本地存储初探
- 初探HTML5的本地存储
- 初探HTML5的本地存储
- 初探HTML5的本地存储
- 【HTML5初探之本地存储】如果没有数据库。。。
- 【html5】html5 本地存储
- 【html5】html5 本地存储
- HTML5本地存储
- HTML5 LocalStorage 本地存储
- HTML5本地存储
- HTML5本地存储
- HTML5 LocalStorage 本地存储
- html5 WebStorage本地存储
- HTML5 本地存储
- HTML5 本地数据存储
- HTML5本地存储
- HTML5之本地存储
- HTML5 本地存储
- QQ窗口抓取及如何进行自动化操作
- 基于Dom 的解析xml 工具类 XmlManager
- ubuntu 用root登录后没法使用chromium 的问题
- XQuery 教程
- HDU 1042 N!
- HTML5 本地存储初探
- 深入理解C/C++数组和指针
- xcode4.2 安装老版本的模拟器
- 源代码阅读技巧2
- 一些图像处理用得着的函数
- 新扬天电脑所配USB键盘功能键驱动问题注意事项
- mysql命令行常用命令
- VC6的动态库工程dll,转成VS2008下可以使用
- Actor模型