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. Xcode 上传代码到GitHub

    几乎所有iOS程序员都上过GitHub寻找开源类库,的确,GitHub上有大量优秀的开源类库供大家学习.但是如何在Xcode中上传代码至GitHub呢? (开始之前先安装git,具体方法这里讲的很清楚 ...

  2. 批处理之 for/f 详解

    含有/F的for格式:FOR /F ["options"] %%i IN (file) DO command FOR /F ["options"] %%i IN ...

  3. (一) .net core 2.0 初体验

    1..net core 2.0环境 .net core 下载地址:https://www.microsoft.com/net/core#windowscmd 问题一:提示[Failed to load ...

  4. SQL语句表名或者字段名和保留字冲突解决方法

    最近开发遇到一个很奇葩的问题,简单做一下笔记 select * from Add ... 以上SQL语句会报错. 原因Add是表名,SQL语句保留字中又有Add 解决方法: select * from ...

  5. SQLserver2008r2安装过程

    首先,下载SQLserver2008的安装包,下载完成打开是以下界面 点击开始安装,随着安装进程,点下一步 . 接着来到设置角色的过程,点击SQL功能安装 然后按下一步,来到功能选择,点击" ...

  6. C# JAVA成员访问修饰符比较

    在面向对象的访问修饰符中常用的有public ,private ,protected C# 访问修饰符: private < protected internal < internal/p ...

  7. 委托、事件、Observer观察者模式的使用解析一

    一.前言 委托.事件得理论我就不解释了,不会的时候觉得很难,会了发现挺简单的,回头想想其实在JavaScript中常常用到,譬如:setTimeout()就是典型的委托. 二.传统编码方式 传统的调用 ...

  8. ZOJ2334 Monkey King 并查集 STL

    题意:两家原始人(猴)打交道后成为一家猴,打交道时两家分别派出最帅的两位猴子,颜值各自减半,问每次打交道后新家族最帅的猴子的颜值.当然,已经是一家子就没有必要打交道了,因为没有猴希望颜值降低,毕竟还得 ...

  9. JS实现时钟特效

    <!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"& ...

  10. Sqoop1.99.7将MySQL数据导入到HDFS中

    准备 本示例将实现从MySQL数据库中将数据导入到HDFS中 参考文档: http://sqoop.apache.org/docs/1.99.7/user/Sqoop5MinutesDemo.html ...