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. ios小型服务器环境配置

    之前买的一台二手iphone4退役了,上闲鱼上一看,就值200,而且耳机声音也有点轻,估计买不了什么钱 于是网上看看能不能有什么废物利用的法子,看到说做行车记录仪的,有说做git服务器的,感觉挺有兴趣 ...

  2. ASP.NET Core 认证与授权[2]:Cookie认证

    由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用户状态,而最常用,也最简单的就是Cookie了,它由浏览器自动保存并在发送请求时自动附加到请求头中.尽管在现代Web应用中,Coo ...

  3. Mysql 基于 Amoeba 的 读写分离

    首先说明一下amoeba 跟 MySQL proxy在读写分离的使用上面的区别: 在MySQL proxy 6.0版本 上面如果想要读写分离并且 读集群.写集群 机器比较多情况下,用mysql pro ...

  4. Linux学习——shell编程之正则表达式和字符处理命令

    shell编程之正则表达式 一 正则表达式 1 什么是正则表达式 正则表达式用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分隔.匹配.查找及替换操作. 2 shell编程之正则表达式 ...

  5. JAVA 反射(1)

    getDeclaredField是可以获取一个类的所有字段. getField只能获取类的public 字段.

  6. Css Html 大风车

    <div style = "height:500px;width:500px;position:static;float:left;"><div class=&q ...

  7. CodeForces 242E二维线段树

                                                                                           E. XOR on Seg ...

  8. 利用jdbc简单封装一个小框架(类似DBUtils)

    利用jdbc写的一个类似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.Inpu ...

  9. C#中 什么是装箱和拆箱

    装箱:将值类型包装为引用类型 拆箱:将引用类型转换为值类型   例如 objetct obj = null; obj = ; //装箱 int i = (int) obj; //拆箱

  10. Java web JavaScript DOM 编程

     JavaScript DOM 编程 (1).DOM概述及分类 (2).DOM结构模型:XML DOM 和 HTML DOM 关系? (3).结点,结点树,结点属性与方法? 1.DOM是什么? d ...