简单地说,File API只规定怎样从硬盘上提取文件,然后交给在网页中运行的JavaScript代码。

与以往文件上传不一样,File API不是为了向服务器提交文件设计的。

关于File API不能做什么也非常值得注意。它不能修改文件,也不能创建新文件。

想保存任何数据,你可以通过Ajax把数据发送到服务器,或者把它保存在本地存储空间中。

取得文件

  • 使用input元素。将其type属性设置为file,这样是最常见的标准上传文本框
  • 隐藏的input元素。为了保证风格一致,可以把input元素隐藏起来,显示一个漂亮的按钮。

    用户点击按钮时,通过JS调用隐藏的input的click事件
  • 拖放。把文件拖放到网页上

读取文本文件readAsText()

使用File API可以直接读取文件文件的内容。创建一个例子

<input name="myAvatar" type="file" onchange="processFiles(this.files)" />

选择一个文件后,会触发这个input元素的onChange事件,因而就会执行processFiles()函数

var output = document.getElementById('fileOutput');
var processFiles = function(files) {
// 一次只允许上传一个文件
var file = files[0];
var reader = new FileReader(); reader.onload = function(e) {
output.textContent = e.target.result;
}
reader.readAsText(file);
};

每个文件对象都有三个有用的属性:name,保存文件名。size保存文件的字节大小。 type

保存文件的MIME类型

一次读取多个文件multiple

为input元素添加multiple属性,一次可以读取多个文件

<input name="myAvatar" type="file" multiple onchange="processFiles(this.files)" />

循环处理多文件。注意onLoad事件是异步的

var processFiles = function(files) {
var fileContents = []; for(var i=0, len = files.length; i< len; i++) {
// 每个文件建立一个文件句柄
var reader = new FileReader();
// 由于onload是异步处理函数,使用闭包记录i值。否则i一直等于len
(function(i) {
reader.onload = function(e) {
fileContents.push(e.target.result);
if(i === len - 1) {
output.textContent = fileContents.join('\n\n\n');
}
}
})(i)
reader.readAsText(files[i]);
}
};

读取图片文件readAsDataURL()

FileReader处理文本内容只需要一步。同样,处理图片内容也这么简单。

这归功于readAsDataURL()方法。

下面的例子涉及处理图片和文件拖放。提交的图片文件用于绘制元素的背景。

var dropBox;
document.addEventListener('DOMContentLoaded', function() {
dropBox = document.getElementById('dropbox');
dropbox.addEventListener('dragenter', ignoreDrag, false);
dropbox.addEventListener('dragover', ignoreDrag, false);
dropbox.addEventListener('drop', drop, false);
}, false)
var processFiles = function(files) {
var file = files[0];
var reader = new FileReader();
reader.onload = function(e) {
dropBox.style.backgroundImage = 'url(' + e.target.result + ')';
}; // 读取图片
reader.readAsDataURL(file);
};
var ignoreDrag = function(e) {
e.stopPropagation();
e.preventDefault();
};
var drop = function(e) {
ignoreDrag(e); var data = e.dataTransfer;
var files = data.files;
processFiles(files);
};

下面是html和css

<div id="dropbox">
<div>Drop your image here</div>
</div>
#dropbox {
margin: 15px; width: 300px; height: 300px;
border: 5px dashed gray; border-radius: 8px;
background: lightyellow; background-size: 100%;
background-repeat: no-repeat; text-align: center;
}
#dropbox div { margin: 100px 70px; color: orange; font-size: 25px; }

更新2014/07/10

对异步循环使用递归

var processFiles = function(files) {
var filesLen = files.length
, reader = null
, fileContents = []
, readFile = function(i) {
if(i === filesLen) { // 递归的结束条件
output.textContent = fileContents.join('\n\n\n');
return;
}
reader = new FileReader();
reader.onload = function(e) {
fileContents.push(e.target.result);
readFile(i+1); // 保证输出顺序
};
reader.readAsText(files[i]);
}; if(!filesLen) return;
readFile(0); // 开始递归
};

参考:the missing manual

File API 读取文件小结的更多相关文章

  1. HTML5 file api读取文件的MD5码工具

    1.工具的用途:用HTML5 file api读取文件的MD5码.MD5码在文件的唯一性识别上有很重要的应用,业内常用MD5进行文件识别.文件秒传.文件安全性检查等: 2.适用性:IE.Chrome皆 ...

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

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

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

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

  4. Java8 新API读取文件内容

    import java.io.IOException;import java.nio.charset.Charset;import java.nio.file.Files;import java.ni ...

  5. Resumable.js – 基于 HTML5 File API 的文件上传

    Resumable.js 是一个 JavaScript 库,通过 HTML5 文件 API 提供,稳定和可恢复的批量上传功能.在上传大文件的时候通过每个文件分割成小块,每块在上传失败的时候,上传会不断 ...

  6. File API 读取上传的文件

    1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...

  7. 网鼎杯-Fakebook-反序列化和SSRF和file协议读取文件

    0x00知识点:SSRF SSRF (Server-side Request Forge, 服务端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外 ...

  8. resumable.js —— 基于 HTML 5 File API 的文件上传组件 支持续传后台c#实现

    在git上提供了java.nodejs.c#后台服务方式:在这里我要用c#作为后台服务:地址请见:https://github.com/23/resumable.js 我现在visual studio ...

  9. 使用FileSystem自带的api读取hdfs中的文件

    博客搬家自https://my.oschina.net/itsyizu/blog/ 1. 创建hadoop MapReduce项目 输入项目名称 创建好的项目初始化状态如下 编写java类 impor ...

随机推荐

  1. 【转】微信小程序给程序员带来的可能是一个赚钱的机遇

    自上周被微信小程序刷屏之后,这周大家都在谈微信小程序能够带来哪些红利的话题,其实我想从程序员的角度来谈谈,带给我们程序员来的红利,或许是我们程序员创业或者赚钱的机遇. 其实我从<作为移动开发程序 ...

  2. 很漂亮的用户登录界面HTML模板

    效果预览:http://keleyi.com/keleyi/phtml/divcss/21.htm HoverTree开源项目实现了分层后,准备实现管理员后台登录,这里先把登录界面的HTML模板整理好 ...

  3. VS2012 单元测试之泛型类(Generics Unit Test)

    关于单元测试,如果不会用可以参照我的上篇博文————在Visual Studio 2012使用单元测试 首先分享一篇博文,[Visual Studio] 开启Visual Studio 2012通过右 ...

  4. 会话技术( Cookie ,Session)

    会话技术:    会话:浏览器访问服务器端,发送多次请求,接受多次响应.直到有一方断开连接.会话结束.        解决问题:可以使用会话技术,在一次会话的多次请求之间共享数据.           ...

  5. React Native 红屏之Could not connect to development server.

    React Native 是目前最火的开发框架,其他不说了,上Bug. 按照  React Native iOS环境搭建 高级版 在mac上  搭建 React Native  环境,运行 项目 若出 ...

  6. Ignite China 2015 之行

    微软首届Ignite China选择了金秋十月的北京,在顺义的九华山庄举办.这几天北京的空气特别好,再加上郊区高楼少,令人心胸开阔了不少.这次Ignite之行的任务有两个,其一是27号晚上与Windo ...

  7. spark streaming 与 kafka 结合使用的一些概念理解

    1. createStream会使用 Receiver:而createDirectStream不会,数据会通过driver接收. 2.createStream使用 Receiver 源源不断的接收数据 ...

  8. Oracle分区表

    先说句题外话-   欢迎成都天府软件园的小伙伴来面基交流经验~ 一:什么是分区(Partition)? 分区是将一个表或索引物理地分解为多个更小.更可管理的部分. 分区对应用透明,即对访问数据库的应用 ...

  9. Tomcat 启动报错:No default web.xml

    原因是:tomcat 中conf 目录中的 web.xml 被无意删除掉了.从其他tomcat中复制一个过来就行了. conf 目录 没有 web.xml 导致的问题是,server.xml 中配置的 ...

  10. SQLSERVER自动定时(手动)备份工具

    最近项目需要,写了一个小工具软件: 1.实时显示监控 2.可多选择备份数据库 3.按每天定时备份 4.备份文件自动压缩 5.删除之前备份文件 直接上图 1.备份监控界面: 2.数据库设置: 附工具下载 ...