html5中文学习网

您的位置: 首页 > html5教程 > 入门教程 » 正文

基于HTML5 FileSystem API的使用介绍_html5教程技巧

[ ] 已经帮助:人解决问题
点评:HTML5的强大之一就是允许web程序申请一些临时或者永久的空间(Quota)在这里可以进行数据的存储甚至文件的操作

HTML5的强大之一就是允许web程序申请一些临时或者永久的空间(Quota)在这里可以进行 数据的存储甚至文件的操作。YzDHTML5中文学习网 - HTML5先行者学习网

FileSystem提供了文件夹和文件的创建、移动、删除等操作,大大方便了数据的本地处理, 而且所有的数据都是在沙盒(sandboxed)中,不同的web程序不能互相访问,这就保证了数据 的完整和安全。YzDHTML5中文学习网 - HTML5先行者学习网

在CatWrite项目中,运用了HTML5的这个特性进行数据的存储,很是方便,只是目前来说只有 Chrome浏览器对FileSystem API支持的比较好,所以只能运行在Chrome浏览器中。YzDHTML5中文学习网 - HTML5先行者学习网

在完成这个功能的时候,查阅了很多资料,有一些资料是一年前的,但是随着浏览器版本的 变化,一些代码已经老化,在这里一一总结和整理。这里只列举了项目中用到的API,算是 对完成功能的一次梳理。YzDHTML5中文学习网 - HTML5先行者学习网

申请空间YzDHTML5中文学习网 - HTML5先行者学习网
为了进行数据的存储,必须要向浏览器进行申请,如果是永久存储还会向用户进行询问,只有 同意后才会继续执行。YzDHTML5中文学习网 - HTML5先行者学习网

首先必须要声明想要的权限。YzDHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
YzDHTML5中文学习网 - HTML5先行者学习网
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; //文件系统请求标识 YzDHTML5中文学习网 - HTML5先行者学习网
window.resolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL; //根据URL取得文件的读取权限 YzDHTML5中文学习网 - HTML5先行者学习网
YzDHTML5中文学习网 - HTML5先行者学习网
得到系统的权限后就可以向浏览器申请空间YzDHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
YzDHTML5中文学习网 - HTML5先行者学习网
window.requestFileSystem(window.PERSISTENT, //persistent(永久) or temporary(临时) YzDHTML5中文学习网 - HTML5先行者学习网
1024*1024, //1M YzDHTML5中文学习网 - HTML5先行者学习网
onInitFs, //成功后的回调函数 YzDHTML5中文学习网 - HTML5先行者学习网
errorHandler); //错误后的回调函数YzDHTML5中文学习网 - HTML5先行者学习网
YzDHTML5中文学习网 - HTML5先行者学习网
回调函数YzDHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
YzDHTML5中文学习网 - HTML5先行者学习网
function onInitFs(fs){ YzDHTML5中文学习网 - HTML5先行者学习网
fs.root.getDirectory('catwrite_documents', {create: true}, function(dirEntry) { YzDHTML5中文学习网 - HTML5先行者学习网
console.log('You have just created the ' + dirEntry.name + ' directory.'); YzDHTML5中文学习网 - HTML5先行者学习网
}, errorHandler); YzDHTML5中文学习网 - HTML5先行者学习网
} YzDHTML5中文学习网 - HTML5先行者学习网
//错误回调 YzDHTML5中文学习网 - HTML5先行者学习网
function errorHandler(err){ YzDHTML5中文学习网 - HTML5先行者学习网
var msg = 'An error occured: '; YzDHTML5中文学习网 - HTML5先行者学习网
switch (err.code) { YzDHTML5中文学习网 - HTML5先行者学习网
case FileError.NOT_FOUND_ERR: YzDHTML5中文学习网 - HTML5先行者学习网
msg += 'File or directory not found'; YzDHTML5中文学习网 - HTML5先行者学习网
break; YzDHTML5中文学习网 - HTML5先行者学习网
case FileError.NOT_READABLE_ERR: YzDHTML5中文学习网 - HTML5先行者学习网
msg += 'File or directory not readable'; YzDHTML5中文学习网 - HTML5先行者学习网
break; YzDHTML5中文学习网 - HTML5先行者学习网
case FileError.PATH_EXISTS_ERR: YzDHTML5中文学习网 - HTML5先行者学习网
msg += 'File or directory already exists'; YzDHTML5中文学习网 - HTML5先行者学习网
break; YzDHTML5中文学习网 - HTML5先行者学习网
case FileError.TYPE_MISMATCH_ERR: YzDHTML5中文学习网 - HTML5先行者学习网
msg += 'Invalid filetype'; YzDHTML5中文学习网 - HTML5先行者学习网
break; YzDHTML5中文学习网 - HTML5先行者学习网
default: YzDHTML5中文学习网 - HTML5先行者学习网
msg += 'Unknown Error'; YzDHTML5中文学习网 - HTML5先行者学习网
break; YzDHTML5中文学习网 - HTML5先行者学习网
}; YzDHTML5中文学习网 - HTML5先行者学习网
console.log(msg + err); YzDHTML5中文学习网 - HTML5先行者学习网
}YzDHTML5中文学习网 - HTML5先行者学习网
YzDHTML5中文学习网 - HTML5先行者学习网
如果成功后悔调用OnInitFs回调函数,在里面用了getDirectory方法用来创建一个文件夹,这下面再说。YzDHTML5中文学习网 - HTML5先行者学习网

但是这是有个问题,这样做的话每次加载页面都会申请,这肯定不是我们想要的,我们要 的是在有数据的时候就可以读取数据。YzDHTML5中文学习网 - HTML5先行者学习网

判断是否申请过空间YzDHTML5中文学习网 - HTML5先行者学习网
所以我们需要读取浏览器的数据,看看是否已有存储。这就用到了另一个API:YzDHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
YzDHTML5中文学习网 - HTML5先行者学习网
void queryUsageAndQuota( YzDHTML5中文学习网 - HTML5先行者学习网
in DOMString url, YzDHTML5中文学习网 - HTML5先行者学习网
in EntryCallback successCallback, YzDHTML5中文学习网 - HTML5先行者学习网
in optional ErrorCallback errorCallback YzDHTML5中文学习网 - HTML5先行者学习网
); YzDHTML5中文学习网 - HTML5先行者学习网
YzDHTML5中文学习网 - HTML5先行者学习网
这个API可以查询当前web的空间情况,如果成功的话就会调用successCallback回调函数 并把已用空间和全部空间作为参数传入方法中。如果失败则调去errorCallback。YzDHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
YzDHTML5中文学习网 - HTML5先行者学习网
window.webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.PERSISTENT, YzDHTML5中文学习网 - HTML5先行者学习网
function(used, remaining){ YzDHTML5中文学习网 - HTML5先行者学习网
if(remaining == ""){ YzDHTML5中文学习网 - HTML5先行者学习网
console.log("未申请空间。"); YzDHTML5中文学习网 - HTML5先行者学习网
}else{ YzDHTML5中文学习网 - HTML5先行者学习网
console.log("已使用空间"+used); YzDHTML5中文学习网 - HTML5先行者学习网
console.log("全部空间"+remaining); YzDHTML5中文学习网 - HTML5先行者学习网
} YzDHTML5中文学习网 - HTML5先行者学习网
}, YzDHTML5中文学习网 - HTML5先行者学习网
errorHandler); </p><p>
YzDHTML5中文学习网 - HTML5先行者学习网
我们可以通过判断remaining参数来判断是否有申请空间,如果没有申请,则返回上一步申请空间。 如果已经有空间的话,则需要得到空间的跟文件,这样才能操作数据。YzDHTML5中文学习网 - HTML5先行者学习网

获取文件入口YzDHTML5中文学习网 - HTML5先行者学习网
FileSystem使用了特殊的文件系统和沙盒模式,在电脑上或者其他web中是无法访问沙盒中的文件的 ,只能用对应的格式去访问。YzDHTML5中文学习网 - HTML5先行者学习网

在浏览器中输入:YzDHTML5中文学习网 - HTML5先行者学习网

?filesystem:http://catcoder.com/persistent/ YzDHTML5中文学习网 - HTML5先行者学习网
  YzDHTML5中文学习网 - HTML5先行者学习网

这样可以访问catcoder.com这个网站在本机永久数据,把persistent换成temporary则是读取临时空间。YzDHTML5中文学习网 - HTML5先行者学习网

然后我们就可以通过URL和对应API获取文件的入口(Lets you look up the entry for a file or directory with a local URL)。YzDHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
YzDHTML5中文学习网 - HTML5先行者学习网
void resolveLocalFileSystemURL( YzDHTML5中文学习网 - HTML5先行者学习网
in DOMString url, YzDHTML5中文学习网 - HTML5先行者学习网
in EntryCallback successCallback, YzDHTML5中文学习网 - HTML5先行者学习网
in optional ErrorCallback errorCallback YzDHTML5中文学习网 - HTML5先行者学习网
); YzDHTML5中文学习网 - HTML5先行者学习网
YzDHTML5中文学习网 - HTML5先行者学习网
下面就可以读取本机存储的数据了YzDHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
YzDHTML5中文学习网 - HTML5先行者学习网
var url = "filesystem:http://" + window.location.host + "/persistent/catwrite_documents/"; YzDHTML5中文学习网 - HTML5先行者学习网
window.resolveLocalFileSystemURL(url,function(fileEntry){ YzDHTML5中文学习网 - HTML5先行者学习网
console.log(fileEntry); YzDHTML5中文学习网 - HTML5先行者学习网
var dirReader = fileEntry.createReader(); YzDHTML5中文学习网 - HTML5先行者学习网
var readEntries = function(){ YzDHTML5中文学习网 - HTML5先行者学习网
dirReader.readEntries(function(results){ YzDHTML5中文学习网 - HTML5先行者学习网
if(!results.length){ YzDHTML5中文学习网 - HTML5先行者学习网
create_file_title("默认文件", ""); YzDHTML5中文学习网 - HTML5先行者学习网
console.log("没有文件!"); YzDHTML5中文学习网 - HTML5先行者学习网
}else{ YzDHTML5中文学习网 - HTML5先行者学习网
console.log("读取到" + results.length + "个文件"); YzDHTML5中文学习网 - HTML5先行者学习网
for(var i = 0; i < results.length; i++){ YzDHTML5中文学习网 - HTML5先行者学习网
console.log(results[i].name); YzDHTML5中文学习网 - HTML5先行者学习网
getFileContentByName(fileEntry, results[i].name); YzDHTML5中文学习网 - HTML5先行者学习网
} YzDHTML5中文学习网 - HTML5先行者学习网
} YzDHTML5中文学习网 - HTML5先行者学习网
},errorHandler); YzDHTML5中文学习网 - HTML5先行者学习网
}; YzDHTML5中文学习网 - HTML5先行者学习网
readEntries(); YzDHTML5中文学习网 - HTML5先行者学习网
},errorHandler); YzDHTML5中文学习网 - HTML5先行者学习网
YzDHTML5中文学习网 - HTML5先行者学习网

YzDHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助