1. File API简介

File API对于某些专门的网站的不可或缺的。现在常用它实现对文件的预览等功能。

File API规定怎么从硬盘上提取文件,直接交给在网页中运行中的Javascript代码。然后代码可以打开文件探究数据,无论是本地文件还是其他文件。注意,关键在于文件会被直接交给JavaScript代码,它并不能修改文件,也不能创建新文件,想要保存任何数据,需要将数据发送到服务器或者保存在本地存储空间中。

2. 读取文件

在通过File API操作文件之前,首先必须取得文件。使用File API可以直接读取文本文件的内容。
例如:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>文件上传</title><style>#fileOutput {border:1px grey solid;width: 500px;}</style>
</head>
<body><input type="file" id="fileInput" onChange="processFiles(this.files)"><div id="fileOutput"></div>
<script>function processFiles(files) {//每个文件对象都有三个有用的属性:name属性保存文件名,size属性保存文件的字节大小,type保存文件的MEMI类型var file = files[0];//创建FileReader对象,var reader = new FileReader();//FileReader用来提取文件内容,但是这个方法是异步的,要提取文件,首先要处理onLoad事件reader.onload = function(e) {//这个事件发生了,意味着数据准备好了,//把它复制到页面的div元素中var output = document.getElementById("fileOutput");//将文件内容转换成一个长字符串,保存在onload事件的e.target.result中output.textContent = e.target.result;};//调用FileReader的readAsText()方法reader.readAsText(file);}
</script>
</body>
</html>


上图中,选择一个文件,无需上传,网页中的javascript代码就能取得文本文件,把内容复制到页面中。

readAsText()方法只能处理文本内容的文件,如CSV格式,XML格式,.docx格式和.xlsx格式的文件。
readAsText()方法只是众多读取文件的方法之一,还有readAsBinaryStrng(),readAsDataURL()和readAsArrayBuffer().

  • readAsBinaryStrng()方法可以让应用处理二进制编码的数据,但基本上就是把数据保存在一个文本字符串中,效率不高。
  • readAsArrayBuffer()是对于做数据处理较好的选择,这个方法将数据读到一个数组中,每个数组项代表一字节数据。这套方案的优势是可以用来创建大块数据,然后切分成更小的二进制数据块,以便逐块处理。
  • readAsDataURL()方法则让我们能方便地取到图片数据。

2.1 一次读取多个文件

HTML5也支持一次提交多个文件,只要为<input>元素添加multiple属性即可:

<input type="file" id="Files" name="files[]" multiple />
<div id="Lists"></div>  
function fileSelect(e) {  e = e || window.event;  var files = e.target.files;  //FileList Objects      var output = [];  for(var i = 0, f; f = files[i]; i++) {  output.push('<li><strong>' + f.name + '</strong>(' + f.type + ') - ' + f.size +' bytes</li>');  }  document.getElementById('Lists').innerHTML = '<ul>' + output.join('') + '</ul>';  }  if(window.File && window.FileList && window.FileReader && window.Blob) {  document.getElementById('Files').addEventListener('change', fileSelect, false);
} else {  document.write('您的浏览器不支持File Api');
}  

由以上代码可以看到,html5为file这个dom元素新增了files接口(e.target指向了file input元素,实际上也可以用this来访问,即this.files),得到的就是FileList,通过遍历该集合,即可访问到各个已选择的文件对象。

2.2 通过拖拽读取图片文件

前面我们看到,FileReader处理文本内容只需要一步,同样,处理图片内容也这么简单,而这就要归功于readAsDataURL()方法。
下面的例子中,让用户把图片拖到页面中,然后在图片上绘制。

下面是HTML和css代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>拖拽图片</title><style>#dropBox {margin: 15px;width: 300px;height: 300px;border:5px dashed grey;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;}</style>
</head><body><div id="dropBox"><div>将你的图片拖到此处</div></div>
</body>
</html>

为处理放置文件的操作,需要处理三个事件:onDragEnter、onDragOver、onDrop。页面一加载完成,就会为这三个事件添加处理程序。

var dropBox;
window.onload = function() {dropBox = document.getElementById("dropBox");dropBox.ondragenter = ignoreDrag;dropBox.ondragover = ignoreDrag;dropBox.ondrop = drop;
}

其中,ignoreDrag()函数同时处理onDragEnter和onDragOver事件,前者在鼠标指针进入放置区时发生,后者在拖动文件的鼠标指针位于放置区之上时发生。之所以用同一个函数处理两个事件,原因就是不必对这两个事件作出反应,只要告诉浏览器自己什么也不做即可。

function ignoreDrag(e) {//因为我们在处理拖放,所以应该确保没有其他元素会取得这个事件e.stopPropagation();e.preventDefault();
}

我们要响应的事件是onDrop,这个事件一发生就说明要取得和处理文件了。

function drop(e) {//取消事件传播及默认行为e.stopPropagation();e.preventDefault();//取得拖进来的文件var data = e.dataTransfer;var files = data.files;//将其传给真正的处理文件的函数processFiles(files);
}function processFiles(files) {var file = files[0];//创建FileReadervar reader = new FileReader();//告诉它准备好数据URL之后做什么reader.onload = function(e) {dropBox.style.backgroundImage = "url('" + e.target.result + "')";};//读取图片:将图片转化为数据URLreader.readAsDataURL(file);
}

效果图:
拖拽前:

拖拽后:

2.3 浏览器对File API的支持情况

更多内容请参考此处

学习File API用于前端读取文件相关推荐

  1. Python file read方法:读取文件

    目录 描述 语法 参数 返回值 使用示例 1. size省略,一次性读完整个文件 2. 指定字节数读取文件 注意事项: 1.  size为负时 2. size为0时 为何要使用Size? 描述 rea ...

  2. python open方法下file模块_python-linecache模块读取文件用法

    python-linecache模块读取文件用法详解 linecache模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行. 1.linecache.getline ...

  3. 前端读取文件图片信息流;js读取图片不同信息流;js读取图片;前端就js读取二进制数据;前端js读取文件流使用FileReader对象的readAsDataURL方法来读取图像文件;

    原文链接 FileReader来把文件读入内存,并且读取文件中的数据. readAsDataURL方法可以在浏览器主线程中异步访问文件系统,读取文件中的数据,且读取后 result 为 DataURL ...

  4. android fileinputstream 获取file,Android FileInputStream没有读取文件

    经过数小时的淘洗后,我现在陷入困境.. 我在使用Android从文件中读取问题时,使用此方法执行此操作的方法如下 private void open(String doc) throws IOExce ...

  5. input file读取文件

    js读取 input file 文件的两种方式: <div id="localImag"><img id="preview" src=&quo ...

  6. 前端大文件上传断点续传解决方案

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  7. .rpt文件内容读取java_Java 中读取文件内容的 n 中方式

    前言 刚接触 java 的时候很困惑一个事情 File相对路径,以哪个目录为参照物. 随着 io 模型的发展,java 1.7 的 nio,使用 Path.Paths 和 Files 等来方便 io ...

  8. java逐行读取文件_Java逐行读取文件

    java逐行读取文件 Today we will look into different java read file line by line methods. Sometimes we have ...

  9. php偷偷接受数据,拒绝人工新增单条数据,PHP实现读取文件导入数据

    今天分享些php导入文件,读取数据,插入数据到数据库的代码,涉及的场景如下: 数据库表系统数据(如:省市区) 前端页面从文件导入数据,插入数据库(如:黑名单导入) 第一个是一个php的脚本代码,实现思 ...

最新文章

  1. linux中man 1 2 3
  2. django批量form表单处理
  3. 在Linux服务器之间迁移帐号信息
  4. Java 进阶—— super 和 this 的用法
  5. Nodejs基础01
  6. 拓扑学(代数拓扑学)的有趣应用
  7. 第四章 蒙特卡洛方法-强化学习理论学习与代码实现(强化学习导论第二版)
  8. 比赛之前的数据清零操作
  9. SSM+Bootstrap+MYSQL演唱会网上订票系统
  10. 新手如何做抖音直播带货?新号如何快速获取直播推荐流量?
  11. 01改变世界:没有计算器的日子怎么过——手动时期的计算工具
  12. 【优化系列】龙芯loongson简介
  13. 黑客张福:互联网是黑暗的森林
  14. 面试官:为啥需要枚举?枚举有什么作用?怎么用枚举实现单例?
  15. 三年磨一剑大话数据结构——数据结构起源、概念和术语
  16. Windows内网穿透远程桌面:公网远程桌面控制内网电脑 2/3
  17. 桂科版计算机工作的奥秘教案,桂科版三年级下册信息技术全册教案.pdf
  18. 微服务容器部署与持续集成(Jenkins)
  19. java 输出流转换成输入流_在JAVA中如何将输出流转为输入流的类的实现
  20. Android设置文字中粗

热门文章

  1. VS2015 + CUDA 8.0 配置GTX1070的OpenCL 开发环境
  2. mysql 图片 格式_mysql存储图片 用什么格式
  3. python控制鼠标_如何用python实现真实的鼠标移动?
  4. python系统自学_如何系统地自学python
  5. python输出数字方阵_在python里输出数字方阵
  6. 计算机地址码特点,电脑摇头灯的地址码的设定问题你必须要注意的
  7. 计算机导论的试题,计算机导论试题
  8. DirectX11中XNA数据库常见的几个函数
  9. JavaScript常用函数之Eval()使用
  10. 弹体飞行姿态仿真软件程序代写