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类型。
- 通过Canvas及File API缩放并上传图片
原文地址:Resize an Image Using Canvas, Drag and Drop and the File API 示例地址:Canvas Resize Demo 原文作者:Dr. T ...
- HTML5 File API的应用
HTML5 File API简介 HTML5File API协议族 Directories and System 文件系统和目录读取 FileWriter 写入文件 FileReader ...
- 使用 JavaScript File API 实现文件上传
概述 以往对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情.虽然伴随着 Web 2.0 应用技术的不断发展,JavaScript 正在扮演越来越重要的角色,但是出于安全性的考虑,JavaScr ...
- 通过 File API 使用 JavaScript 读取文件
原文地址:http://www.html5rocks.com/zh/tutorials/file/dndfiles/ 简介 HTML5 终于为我们提供了一种通过 File API 规范与本地文件交互的 ...
- API 设计 POSIX File API
小结: 1. https://mp.weixin.qq.com/s/qWrSyzJ54YEw8sLCxAEKlA API 设计最佳实践的思考 谷朴 阿里技术 昨天 阿里妹导读:API 是模块或者子 ...
- Java Content Repository API 简介 转自(https://www.ibm.com/developerworks/cn/java/j-jcr/)
Java Content Repository API 简介 1 如果曾经试过开发内容管理应用程序,那么您应当非常清楚在实现内容系统时所遇到的固有难题.这个领地有点支离破碎,许多供应商都有自己的私有仓 ...
- HTML5的File API读取文件信息
html结构: <div id="fileImage"></div> <input type="file" value=" ...
- 图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
一 . 背景及效果 当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入. 图片 ...
- File API 读取文件小结
简单地说,File API只规定怎样从硬盘上提取文件,然后交给在网页中运行的JavaScript代码. 与以往文件上传不一样,File API不是为了向服务器提交文件设计的. 关于File API不能 ...
随机推荐
- Java 中与(&)短路与(&&)以及 或(|)短路或(||)的关系
一.逻辑运算符的使用 1)逻辑运算符的连接的是布尔表达式,要与位运算符做区分. 2)使用方法: public class Test { public static void main(String[ ...
- 基于Quartz实现简单的定时发送邮件
一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...
- CodeForces 242E二维线段树
E. XOR on Seg ...
- Ansible(三) - playbook简介
Ⅰ. Playbook介绍 Playbook其实就是ansible的一个任务列表,各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个.在顺序运行某playb ...
- URL不能过长,否则summit方法提交失败
MVC5.0+EF6.0,和浏览器的版本有关系.IE最多1024KB. URL不能过长,否则summit方法提交失败.
- 英特尔:不再公布PC处理器多核睿频数据
据了解,以往英特尔官方有三个频率数据:基础主频:Turbo 2.0(多核)频率:以及Turbo 3.0(单核)频率.现在被隐匿的则是Turbo 2.0(多核)频率. 对此,英特尔在回应媒体时表示,给出 ...
- jvm的垃圾回收算法
一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...
- Jquery 使用Ajax获取后台返回的Json数据后,页面处理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SAP 参照sto订单创建外向交货BAPI
DATA: SHIP_POINT TYPE TVST-VSTEL, "装运点/接收点 NUM_DELIVERIES TYPE VBNUM, STOCK_TRANS_ITEMS WITH HE ...
- 【爬虫入门手记03】爬虫解析利器beautifulSoup模块的基本应用
[爬虫入门手记03]爬虫解析利器beautifulSoup模块的基本应用 1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.Bea ...