File API让我们可以创建文件,存储在本地文件系统的一个安全沙箱里,亦可以从其他来源读取文件,并对其进行操作

 
Web应用通过requestFileSystem方法来访问本地文件系统,该方法是全局的:
requestFileSystem(type, size, successCallback, opt_errorCallback);
 
第一个参数表示存储的类型,有两个值可以选择,TEMPORARY或 PERSISTENT。使用TEMPORARY的话,存储的数据会由浏览器自行决定何时清除。PERSISTENT则表示只能由你的程序来决定何时清除数据。
第二个参数是数字,表示你希望使用多大的空间,单位是MB,后两个参数分别是请求成功和失败(可选)的回调方法。
如果一切顺利的话,系统会调用成功的回调函数,并传入一个FileSystem对象,所有File API或多或少都需要基于此对象来使用。
 
创建文件:
window.requestFileSystem(TEMPORARY, 1024 * 1024, function(fs) {
    fs.root.getFile('myfile.txt', {create: true}, function(fileEntry) {
       // do something with the fileEntry
     });
});
getFile方法可以用来创建或者获取文件,第一个参数是文件名,可以包含绝对或相对的路径,第二个参数是一个JS对象,用来决定当文件不存在时函数的行为,在本例中create:true表示,当文件不存在时,函数会创建此文件,反之会抛异常,你可以使用fileEntry的getMetaData方法获取文件的元数据
fileEntry.getMetaData(function(md) {
    alert(md.modificationTime.toDateString());
}, onError);
 
读取文件:得到了fileEntry对象后,你可以调用它的file方法配合FileReader API来获取文件内容了
requestFileSystem(TEMPORARY, 1024*1024, function(fs) {
fs.root.getFile('myfile.txt', {}, function(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onload = function(e) {
alert(reader.result);
};
reader.readAsText(file); // 把文件作为纯文本读取(其他格式亦可)
});
});
});
 
写文件:
var BlobBuilder = WebKitBlobBuilder;
requestFileSystem(TEMPORARY, 1024*1024, function(fs) {
fs.root.getFile('temp.txt', {create: true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwrite = function(e) {
console.log('写入完毕');
};
fileWriter.onerror = function(e) {
console.log('写入失败')
};
var bb = new BlobBuilder();
bb.append('my file contents');
fileWriter.write(bb.getBlob('text/plain'));
});
});
});
写文件的步骤大致如下,先使用BlobBuilder API创建一个二进制对象,传给fileWriter对象的write方法,然后在fileWriter对象的onwrite/onerror事件里面响应写入的成功或失败。
 
对现有文件追加内容:
BlobBuilder = BlobBuilder || WebkitBlobBuilder || MozBlobBuilder;
requestFileSystem(TEMPORARY, 1024*1024, function(fs) {
var bb = new BlobBuilder;
fs.root.getFile('myfile.txt', {create: false}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.seek(fileWriter.length);
fileWriter.write(bb.getBlob('text/plain'));
});
});
});
上面的代码调用了fileWriter对象的seek方法,把文件指针移动到指定的位置,新位置从文件头开始以字节数度量,本例中使用fileWrtier.length作为参数,即将文件指针移动到文件末尾,然后进行写入
 
如何导入文件到filesystem:
1 使用<input type="file" />标签
2 使用HTML5的拖拽API
3 使用XMLHttpRequest
4 使用copy & paste
 
input:
document.getElementById('myfile').onchange = function(e) {
var f = this.files[0];
requestFileSystem(TEMPORARY, 1024*1024, function(fs) {
fs.root.getFile(f.name, {create:true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.write(f);
});
});
});
};
fileWriter的write方法可以接受二进制对象或者File(实际上所有File都是blob)。
 
使用XMLHttpRequest下载远程文件:
var writeBlob = function(dir, blob, fileName, callback) {
dir.getFile(fileName, {create: true}, function(fileEntry) {
fileEntry.createWriter(function(writer) {
if (callback) {
writer.onwrite = callback;
}
writer.write(blob);
});
});
};
var downloadImage = function(url, mimeType) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
var parts = url.split('/');
var fileName = parts[parts.length - 1];
window.requestFileSystem(TEMPORARY, 1024*1024*5 /*5MB*/, function(fs) {
var onWrite = function(evt) {
console.log('写入成功.');
};
// 注意:这里不是xhr.responseText
writeBlob(fs.root, xhr.response, fileName, onWrite);
});
}
};
xhr.send(null);
};
downloadImage('your/img.jpg', 'image/jpeg');
上面的代码从远程加载一个文件并存入本地Filesystem,需要注意的是,在发出请求前,需要先设置xhr.responseType,可以根据你需要返回的数据类型从text, arraybuffer, blob或document中任选一种,省略的话则默认为text类型。
 
 

File API简介的更多相关文章

  1. 通过Canvas及File API缩放并上传图片

    原文地址:Resize an Image Using Canvas, Drag and Drop and the File API 示例地址:Canvas Resize Demo 原文作者:Dr. T ...

  2. HTML5 File API的应用

    HTML5 File API简介 HTML5File API协议族 Directories and System   文件系统和目录读取 FileWriter   写入文件 FileReader   ...

  3. 使用 JavaScript File API 实现文件上传

    概述 以往对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情.虽然伴随着 Web 2.0 应用技术的不断发展,JavaScript 正在扮演越来越重要的角色,但是出于安全性的考虑,JavaScr ...

  4. 通过 File API 使用 JavaScript 读取文件

    原文地址:http://www.html5rocks.com/zh/tutorials/file/dndfiles/ 简介 HTML5 终于为我们提供了一种通过 File API 规范与本地文件交互的 ...

  5. API 设计 POSIX File API

    小结: 1. https://mp.weixin.qq.com/s/qWrSyzJ54YEw8sLCxAEKlA API 设计最佳实践的思考 谷朴 阿里技术 昨天   阿里妹导读:API 是模块或者子 ...

  6. Java Content Repository API 简介 转自(https://www.ibm.com/developerworks/cn/java/j-jcr/)

    Java Content Repository API 简介 1 如果曾经试过开发内容管理应用程序,那么您应当非常清楚在实现内容系统时所遇到的固有难题.这个领地有点支离破碎,许多供应商都有自己的私有仓 ...

  7. HTML5的File API读取文件信息

    html结构: <div id="fileImage"></div> <input type="file" value=" ...

  8. 图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传

    一 . 背景及效果 当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入. 图片 ...

  9. File API 读取文件小结

    简单地说,File API只规定怎样从硬盘上提取文件,然后交给在网页中运行的JavaScript代码. 与以往文件上传不一样,File API不是为了向服务器提交文件设计的. 关于File API不能 ...

随机推荐

  1. ExtJS配置与入门项目创建

    Sencha Cmd下载:http://cdn.sencha.com/cmd/6.5.2/jre/SenchaCmd-6.5.2-windows-64bit.zip ExtJS-6.2.0下载:htt ...

  2. NOIP2017SummerTraining0714

    个人感受:第一题做了字典树,还运行错误,然后就弃疗了,然后水了二三两题,总共拿了85分,倒数. 正确答案 时间限制: 2 Sec  内存限制: 256 MB提交: 702  解决: 82[提交][状态 ...

  3. thinkphp增删改查

    添加数据: (添加单行数据) // 添加成功返回1,失败返回0 (添加多行数据) // 返回添加数据的条数 删除数据: 修改数据: (修改单个字段) (修改多个字段) // 修改成功返回1,失败返回0 ...

  4. HTML5基础知识及相关笔记

    HTML5基础 1.1HTML文件的基本结构和W3C标准 1.1.1HTML简介 HTML是一种描述网页的语言,一种超文本标记的语言! 1.1.2HTML文件的基本结构 头部(head) 头部是网页的 ...

  5. git添加比较和合并工具(meld)

    git 下的(difftool)和(mergetool)是专门提供给使用者用自己的工具进行diff和merge的命令: # git config --global diff.tool meld # g ...

  6. jvm内存分配和回收策略

    在上一篇中,已经介绍了内存结构是什么样的. 这篇来介绍一下 内存是怎么分配的,和怎么回收的.(基本取自<深入理解Java虚拟机>一书) java技术体系中所提倡的自动内存管理最终可以归结为 ...

  7. C#一款比较美观的验证码

    using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System. ...

  8. DataRow和DataRowView的区别

    可以将DataView同数据库的视图类比,不过有点不同,数据库的视图可以跨表建立视图,DataView则只能对某一个DataTable建立视图. DataView一般通过DataTable.Defau ...

  9. python重试(指数退避算法)

    本文实现了一个重试的装饰器,并且使用了指数退避算法.指数退避算法实现还是很简单的.先上代码再详细解释. 1.指数退避算法 欠奉.http://hugnew.com/?p=814 2.重试装饰器retr ...

  10. Scala 运算符和集合转换操作示例

    Scala是数据挖掘算法领域最有力的编程语言之一,语言本身是面向函数,这也符合了数据挖掘算法的常用场景:在原始数据集上应用一系列的变换,语言本身也对集合操作提供了众多强大的函数,本文将以List类型为 ...