HTML5项目笔记6:使用HTML5 FileSystem API设计离线文件存储

在移动环境或者离线环境中,WebDataBase 虽然能够存储并有效地管理和维护客户端的数据集合,但是仍不能满足对包含大段数据文件的存储和多种不同格式文件的保存,于是我们就需要离线的文件管理系统来维护我们工作了,基于HTML5的FileSystem API 就充当这这个角色。

通过这个FileSystem API,我们的Web应用程序可以阅读,浏览,编辑和操纵本地文件系统。

FileSystem API的主要功能有:


Reading and manipulating files: File/Blob, FileList, FileReader


Creating and writing: BlobBuilder, FileWriter


Directories and filesystem access:DirectoryReader,FileEntry/DirectoryEntry,LocalFileSystem

支持情况和存储空间的限制:

目前主流浏览器中,chrome应该是支持文件操作系统最好的浏览器,只要你配置好相关的操作数据,浏览器允许你创建没有限制的存储空间。

现在我们来封装和提取基于FileSystem API的公用方法。

首先,我们需要拿到FileSystem API的可操作的数据上下文:

FileSystem API通过调用 window.requestFileSystem() 来请求文件系统进行操作,

然后编写一个DSDataFactory的函数(这个函数旨在对文件夹的操作),

在这个函数中内置相应的属性和方法,包含了文件请求系统的大小,默认为1兆,文件类型,默认为临时空间;内置的错误信息,这个错误信息可以自定义,在后面会讲到。

这个DSDataFacory函数里面,还包含着另外两个函数,一个函数用于创建文件,一个函数用于移除文件夹(同时移除该文件夹内的所有文件)。

创建一个文件夹(包含两个参数,一个是文件夹名称 directoryName,一个是回调函数callback):

这样就在浏览器缓存中创建了一个文件夹,并返回文件夹的名称。

移除文件夹以及文件夹下面的所有文件(递归移除),这边有两个参数:一个是direcotoryName,指的是待文件夹的名称,这个其实应该指的是该文件夹的路径,一个是回调函数,返回移除的文件夹的名称,下面的dirEntry.removeRecursively指的是递归删除:

第三步骤我们编写一个FSDataFactory的函数(这个函数旨在对文件的操作),这边我们把对文件夹的操作和对文件的操作分离成两个不同的类是为了更加清晰的操作,同样的,我们通过访问FileSystem API来请求文件系统作为入口操作:

在这个FSDataFactory函数内我们包含了一些我们最经常用的,对文件系统的CURD的操作,下面我们会一个一个讲到。

逐级创建文件和文件夹(包含了两个参数fileName(你要创建的文件名称,更确切的说应该是文件路径)和callback回调函数):

这里面其实是递归调用了createDir函数,来逐级地创建文件夹,检查到最后一级的时候,检查是文件还是文件夹,如果包含 . 则认定为文件,否则为文件夹。

如fileName=”/BenFirst/BenSecond/BenThird/”,则会按顺序相继地创建这三个文件夹,

如果fileName=” /BenFirst/BenSecond/BenThird/Ben.txt”,则会相继创建文件夹,并在BenThird文件夹下面创建Ben.txt文件

逐级创建文件和文件夹并写入内容(包含了三个参数fileName(你要创建的文件名称,更确切的说应该是文件路径)、content(你要写入的内容)和callback回调函数):

做法与上面的一样,就是多了一个参数content,传入你需要写入的文字,他会在系统中创建一个Blob并写入文件中,该方法适用于创建.txt类型的文件。

根据文件名(其实是根据文件路径)来读取文件,包含两个参数,一个文件名称fileName和一个回调函数callback:

根据文件路径来读取文件并输出文件内容,这边还自定义了错误输出:如果出现错误,则调用了回调函数,输出字符串“0”。所以当这边出现NOT_FOUND_ERR

错误的时候不会输出系统定义的错误信息二回输出我们定义的错误信息。这样有利用我们将信息反馈给用户。

根据文件名称(也就是完整的文件路径)删除文件:通过查找到该文件,并执行删除,包含两个参数,一个文件名称fileName和一个回调函数callback:

删除完成之后通过回调函数返回被删除的文件的名称

根据文件名称来对文件的内容进行追加(先读取文件,然后将传入的内容添加到文件中):

逐级创建文件和文件夹并写入内容(包含了三个参数fileName(你要创建的文件名称,更确切的说应该是文件路径)、content(你要写入的内容)和callback回调函数):

这个调用了之前的writeNewFile函数,唯一的区别就是他在调用writeNewFile之前还调用了fileEntry.Remove函数,就是先对文件进行删除,然后再创建文件。

至此,在 HTML5 下的文件的处理方法我们基本有了,我们可以灵活地对文件进行操作。如果有不够的地方,我们可以继续修改完善。

在代码的结尾我们进行了实例化,

我们把这些代码独立地存放到FileSystem.js文件里面,这样可以在继承这个脚本文件的页面里直接调用这个脚本库的方法。

我们源码中的public.js脚本中有GetRequest()函数,用于解析地址参数的:

我们的log.js脚本页面里面,包含了对console.debug(msg),控制台信息输出的二次封装,所以下面会经常看到里面的一个方法:log.debug(msg),用于调试时输出我们需要的的信息。

我们的 FormSerialy.js里面的序列化函数,在下面序列化表单的时候也有用到。

这些脚本文件都在我们的源码里面,有兴趣可以系统地看一看

离线工作系统在用户工作日志保存那一块就是将填写的数据保存在离线的文件系统中,通过txt文件来保存的。

现在来看这个应用的实际操作:

在DraftBox.htm 这个页面,我们存放我们在网络离线情况下写好的工作日志,并且把它保存在客户端的WebDataBase和FileSystem里面。所以我们可以在这个页面看到我们离线时的数据日志列表。 

相关的业务代码如下:

而WorkDiary.htm 这个页面,是我们设计好的工作日志的填写表单:包含了标题,工作时间,工作计时,工作内容等字段。

下面是WorkDiary.htm页面的相关业务代码:

保存到数据库的结果如图:

保存到离线文件中的结果如图:

这样子,我们不但将数据保存到离线数据库中,也将表单的数据序列化之后以JSON格式存入txt中。

优点在于:

1、可以在这个txt里面放大量数据,譬如这个WorkDiary_Content这个字段,是填写工作日志的,可能大数据量,存在文件里面比较适合。

2、可以在某种程度上提高了重要数据的安全性,一般用户如果没有操作toURL函数,是不能直接获取到该txt文件的路径进而看到内容的,不像WebDataBase,用户可以直接在浏览器开发者工具的Resources面板中直接看到。

3、文件格式的多样性,除了保存txt文件之外,还可以保存多媒体文件如mp3,图片文件如png。

时间: 2024-08-08 03:47:54

HTML5项目笔记6:使用HTML5 FileSystem API设计离线文件存储的相关文章

HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

HTML5项目笔记1:项目准备和工具使用

公司的 New Case,有需要离线应用工作系统这一块,目标是网络无论在线或离线情况下都可以执行系统操作,这样员工在无网络的情况下依然可以执行公司的项目任务,进行表单填报和数据的客户端保存,并在网络通畅的时候与服务端进行交付和数据通信.整体设计经过讨论使用HTML5的功能开发,并指定用户使用特定的浏览器. 该系统包含了HTML5的Form API(表单),WebStorage API,Communication API(用于跨域访问),WebDataBase API,File System AP

HTML5项目笔记2:离线系统表单设计

在这个离线系统中,表单无疑是构成这个离线系统的视图部分,作为最前端,与客户的操作最密切相关的一块,所以我们有必要先了解一下HTML5的Forms API,它有如下特性: 表单仍然使用Form元素作为容器,我们可以在其中设置基本的提交性质: 用户或者开发人员提交页面的时候,表单仍用于向服务器端发送表单中控件的值: 沿用之前的表单控件及其使用方法,并不断发展和增加新的控件和功能: 可以用脚本操作表单控件: HTML5包含了大量的新的API和元素类型,如下: 新的输入型控件: 类型 用途 input 

一步一步跟我学习hadoop(6)----hadoop利用FileSystem API 执行hadoop文件读写操作

hadoop文件系统较普通的文件系统差异性主要在于其容错性,普通文件系统不能直接查看hadoop的hdfs对应的文件信息.文件存储起来之后,我们是需要可以访问才能够体现它的价值,hadoop提供了FileSystem API来进行hadoop的文件读写. 本节我是对照hadoop的API中的FileSystem类写的demo,包含了一些主要的方法,更多的需要从相关api中进行查询编写. package org.apache.hadoop.wyg; import java.io.IOExcepti

HTML5项目笔记7:使用HTML5 WebStorage API构建与.NET对应的会话机制

HTML5的Web Storage API,我们也称为DOMStarage API,用于在Web请求之间持久化数据.在Web Starage API 出现之前,我们都是将客户端和服务端之间的交互数据存储在远程服务器上,随着Web Starage API的出现,我们可以在客户端存储我们重复访问的交互数据,用户在打开浏览器的时候,可以快速地读取到数据,减少了用户等待,数据流量. 在Web Starage 出现之前,我们在客户端存储数据一般使用Cookie,用于客户端和服务端之间保存会话标识符,同时可

HTML5项目笔记3:使用Canvas设计离线系统的Logo

HTML5 的Cavans API可以动态来展示图形.图表.图像以及动画,我们的这个离线系统中,主要用来设计Logo用的.在网页上使用Canvas的时,他会创建一块矩形区域,默认情况下宽为300像素,高为150像素,当然,可以自定义. 因为我们离线系统主要职责用于在离线的情况下的工作系统,如在上面写工作日志,工作计划,和保存项目的评估数据:在网络在线的情况下与服务器交互,并将数据保存到Server的数据库中.所以我们的这个离线系统被命名为OFLMAIL,我们就根据这个名字来设计Logo. can

HTML5项目笔记5:使用HTML5 WebDataBase设计离线数据库

基于HTML5的Web DataBase 可以让你在浏览器中进行数据持久地存储管理和有效查询,假设你的离线应用程序有需要规范化的存储功能,那么使用Web DataBase,可以使你的应用程序无论是在离线或者在线或者网络不通畅情况下都可以将数据保存在客户端. 下面是HTML5 DataBase中两个不同的DataBase的比较,摘自http://www.html5rocks.com/en 上面的一篇文章. 我们这边使用WebSQL来设计和编写底层服务,W3C 的 WebDatabase 规范中说这

Head First HTML5 Programming笔记--chapter1 认识HTML5

升级到HTML5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 //EN" "http://www.w3.org/TR/html14/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <ti

HTML5学习笔记五:html5表单

表单是页面上非常重要的一块内容,用户可输入的大部分内容都是在表单元素中完成的,与后台的交互大多数也是通过点击表单中的按钮. 一.新增的元素和属性 1.新增属性: 1.1 form属性:页面中的任何元素指定form属性,属性值为相应表单的id,该元素就属于指定表单了:只有Opera 10支持. 1.2 placeholder属性:文本框处于未输入状态且未获取光标焦点时,模糊显示输入提示文字:Safari 4,chrome3,firefox4 1.3 autofocus属性:打开页面时,有该属性的控