简单地说,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. 深入Java关键字this的用法的总结

    在Java程序设计中经常会见到this的使用,this使得程序设计变得规范.简单.灵活.但是在使用过程中,在不同场 合它的含义并不完全相同,使用不当还会出现错误, 本文对this的几种用法和出现的问题 ...

  2. 我与ADO.NET二三事(2)

    继上篇开始,这里主要再次精简.因为大家已经熟悉了主要思想以及它的工作方式.那么这里提供的案例改动会很大.上篇的DatabaseCommand***均是为了大家能够轻松的理解所临时编写的.这次提供的接口 ...

  3. 解决Visual C++ Redistributable for Visual Studio 2015的安装问题

    1. Visual C++ Redistributable for Visual Studio 2015系统要求:Windows 7情况下必须是Windows 7 with SP1.或者Windows ...

  4. 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践

    参考高性能javascript 理解浏览器UI线程  用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程  UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...

  5. K近邻模型(k-NN)

    原理 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻 ...

  6. Git remote 修改源

    Git remote 修改源 git commit -m "Change repo." # 先把所有为保存的修改打包为一个commit git remote remove orig ...

  7. Mac版PhpStorm之XAMPP整合apache服务器配置

    版权声明:本文为博主原创文章,未经博主允许不得转载. 选择在PhpStorm集成apache服务器,下面是我自己的亲测的步骤. 1.如何修改apache默认端口 xampp apache默认的http ...

  8. IOS基础之UILineBreakModeWordWrap

    UILineBreakModeWordWrap详细解释如下:  typedef enum {     UILineBreakModeWordWrap = 0,     UILineBreakModeC ...

  9. python之ATM

    每次做一点就发出来,大神不要嫌重复 2016/11/4 今天来搞ATM,反正逃不了的,说来惭愧,这个作业是我10/4号20天前拿到的,当时是万脸蒙比的,今天又做了一点,现在算是百脸蒙比吧. 一.需求: ...

  10. sql 截取日期

    截取日期: select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'yyyy-mm')from dual; 或得年或月或日   Year/ month/Da ...