HTML5 文件域+FileReader 读取文件(一)
在HTML5以前,HTML的文件上传域的功能具有很大的局限性,这种局限性主要体现在如下两点:
- 每次只能选择一个文件进行上传
- 客户端代码只能获取被上传文件的文件路径,无法访问实际的文件内容
一、FileList对象和File对象
HTML5为type='file' 的<input/>元素增加了两个属性。
- accept:该属性控制允许上传的文件类型。该属性为一个或多个MIME类型字符串。多个MIME类型字符串之间应以都好分割。
- multiple:该属性设置是否允许选择多个文件
JavaScript可以通过files属性访问type='file'的<input/>元素生成的文件上传域的所有文件,该属性返回一个FileList对象,FileList对象相当于一个数组,开发者可以使用类似于数组的方法来访问该数组内的每个File对象。
File对象是一个JavaScript对象,可以通过该对象获取浏览器的所有文件信息。File对象包含如下属性。
- name:返回该File对象对应的文件的文件名, 不包括文件路径部分
- type:返回该File对象的文件的MIME类型字符串。
- size:返回该File对象的对应的文件的大小,字节单位
实例:
- 预览图片:
- <input id="images" type="file" multiple accept="image/*" />
- <script type="text/javascript">
- var imgInput = document.getElementById('images');
- imgInput.onchange = function () {
- //1.获取所有选中文件列表
- var fileList = imgInput.files;
- //2.遍历显示信息
- for (var i = 0; i < fileList.length; i++) {
- var file = fileList[i];
- //一次读取文件的文件名,文件类型,文件大小
- var div = document.createElement('div');
- div.innerHTML = "第" + (i + 1) + "个文件的文件名:" +
- file.name
- + ",文件类型:" + file.type
- + ",文件大小:" + file.size;
- //添加到 body中
- document.body.appendChild(div);
- }
- }
- </script>
显示结果:
提示:该文件选择框设置了accept='image/*'只显示图片。
不要靠accept属性来过滤文件类型,因为这只是客户端的文件类型过滤,这种文件类型过滤是很脆弱的,如果开发者需要进行文件上传,则必须在服务器端对文件类型进行过滤。
二、使用FileReader读取文件内容
FileReader同样是一个JavaScript对象,开发者可以通过该对象在客户端读取 文件上传域所选择的文件内容.关于FileReader
实例1:
- <div>
- 读取文本文件: <input type="file" id="file1" />
- </div>
- <div>
- 读取为二进制: <input type="file" id="file2" />
- </div>
- <div>
- 读取为DataURL: <input type="file" id="file3" accept="*" />
- </div>
- <p id="result" style="width:100%;word-break:break-all;word-wrap:break-word;"></p>
- <script type="text/javascript">
- //判断浏览器是否支持FileReader对象
- var reader
- if (FileReader) {
- reader = new FileReader();
- } else {
- alert('您的浏览器不支持FileReader对象');
- }
- //1.读取为文本
- var file1 = document.getElementById('file1');
- file1.onchange = function () {
- var file = file1.files[0];
- //判断读取的第一个文件是否是文本文件
- if (/text\/\w+/.test(file.type)) {
- //以文本的方式读取内容
- reader.readAsText(file, 'gbk');
- reader.onload = function () {
- document.getElementById('result').innerHTML = reader.result;
- }
- } else {
- alert('读取的不是文本文件');
- }
- }
- //2.读取为二级制
- var file2 = document.getElementById('file2');
- file2.onchange = function () {
- var file = file2.files[0];
- //以二进制流的方式读取第一个文件
- //reader.readAsArrayBuffer(file); //返回二进制数组
- reader.readAsBinaryString(file); //返回二进制字符串
- reader.onload = function () {
- document.getElementById('result').innerHTML = reader.result;
- }
- }
- //3.读取为DataURL
- var file3 = document.getElementById('file3');
- file3.onchange = function () {
- var file = file3.files[0];
- reader.readAsDataURL(file);
- reader.onload = function () {
- document.getElementById('result').innerHTML = reader.result;
- }
- }
- </script>
FileReader在读取文件的过程中可能多次触发onprogress事件,通过该事件绑定监听器即可实时监控文件的读取进度。
提示:FileReader只是客户端的JavaScript对象,使用FileReader所进行的上传也只是把磁盘上的文件读取到浏览器内存中,并未真正上传到服务器。如果需要真正把客户端文件上传到服务器,则可把文件数据以POST请求方式提交到远程服务器,远程服务器负责接收文件数据,并把数据内容保存到服务器。
实例2:
- <div>
- 读取二进制文件:
- <input type="file" id="file1" accept="*" />
- </div>
- <div>
- 显示进度:
- <progress id="pro" value="0"></progress>
- </div>
- <div id="result"></div>
- <script type="text/javascript">
- var file1 = document.getElementById('file1');
- file1.onchange = function () {
- var file = file1.files[0];
- //读取为二进制
- var reader = new FileReader();
- reader.readAsBinaryString(file);
- //显示进度
- var pro = document.getElementById('pro');
- pro.max = file.size;
- pro.value = 0;
- reader.onprogress = function (e) {
- pro.value = e.loaded;
- }
- reader.onload = function () {
- document.getElementById('result').innerHTML = reader.result;
- }
- }
- </script>
HTML5 文件域+FileReader 读取文件(一)的更多相关文章
- HTML5 文件域+FileReader 读取文件并上传到服务器(三)
一.读取文件为blob并上传到服务器 HTML <div class="container"> <!--读取要上传的文件--> <input type ...
- HTML5 文件域+FileReader 读取文件(二)
一.读取文本文件内容,指定字符编码 <div class="container"> <!--文本文件验证--> <input type="f ...
- HTML5 文件域+FileReader 分段读取文件并上传(八)-WebSocket
一.同时上传多个文件处理 HTML: <div class="container"> <div class="panel panel-default&q ...
- FileReader读取文件详解
FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件. input:file 在介绍FileReader之前,先简单介绍input的file类型. <in ...
- FileReader读取文件
前言:FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件. input:file 在介绍FileReader之前,先简单介绍input的file类型. < ...
- FileReader读取文件里文乱码问题
有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=newString(str.getBytes(),"UTF-8");结果大部分中文显 ...
- H5 FileReader读取文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数
一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...
- python练习六十一:文件处理,读取文件内容
python练习六十一:文件处理,读取文件内容 假设要读取text.txt文件中内容 写文件(如果有文件,那直接调用就行,我这里自己先创建的文件) list1 = ['python','jave',' ...
随机推荐
- 中文简体windows CMD显示中文乱码解决方案
因为重装系统,以前是英文的,现在的镜像文件是中文简体windows 10.所以只能将就使用. 下载了JDK,CMD 写了命令java,结果一堆乱码(问号???).发现System的locale默认设置 ...
- input 标签左对齐
不要忘记下载jquery包,并引用到工程文件里. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...
- Android 批量上传sd卡图片
最近手头上需要批量上传一些保存到SD卡图片由于简单,过于忘记,写在博客中吧!同时也希望能帮到大家! 一 . 以下是一个Service类 package cn.com.service; import j ...
- HDOJ 2073 无限的路
Problem Description 甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形: 甜甜的好朋友蜜蜜发现上面的图还 ...
- xcode4的workspace里各lib工程与app工程联编之runscript简介
copy from:http://www.cnblogs.com/xiaouisme/archive/2012/02/06/2339470.html 本文讲解怎么在xcode4的workspace里配 ...
- MySQL 创建库
CREATE DATABASE IF NOT EXISTS database_name DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 这种创建方式能保证数 ...
- lightoj 1251 (Two_Sat)
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #inclu ...
- 解决mysql不能远程登录的问题
1. 改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...
- 使用Ant自动化发布web工程
通常在web应用程序需要上线或测试时通常需要部署到类似于tomcat.jboss.weblogic或webspare这些web服务器中,为避免手动部署带来的操作繁琐.易出错等问题,这里使用ant进行标 ...
- DOM解析原理
用于处理XML文档的DOM元素属性 childNodes:返回当前元素所有子元素的数组: firstChild:返回当前元素的第一个下级子元素: lastChild:返回当前元素的最后一个子元素: n ...