FileReader:读取本地图片文件并显示

2013年07月22日 20:41helloweba.com 作者:月光光 标签:HTML5 

最近忙得比狗还惨,导致长时间没能更新文章,真心对不住啊。抽空整理了下关于在页面上读取和显示本地图片的实例文章,本文通过实例讲解如何使用支持FileReader浏览器的用户将能够通过一个file input选择一个图片文件,并不经过上传而直接将图片显示在页面中。

要想在页面上显示本地图片,以前我们通常的做法是将选择的图片文件上传至后端服务器,后端对其进行存储,再将图片的URL返回到前端,前端通过这个URL来显示图片。而HTML5的FileReader接口支持本地预览,FileReader接口主要是将文件读入内存,并提供相应的方法,来读取文件中的数据,当然就能显示本地图片不需上传了。目前高级浏览器实现了FileReader接口,所以像IE6这些老东西直接滚粗。

在此之前,我们有文章:HTML5应用之文件拖拽上传,看完这篇文章后,你可以尝试制作一个拖拽和显示图片、编辑图片、最后上传的功能。

HTML

第一步创建html,我们在页面中放置一个文件选择的input#file_input和一个显示结果的div#result。

<p>
   <label>请选择一个图像文件:</label>
   <input type="file" id="file_input" />
</p> 
<div id="result"></div>

Javascript

通过getElementById获取节点,判断浏览器的兼容性,对于不支持FileReader接口的浏览器将给出一个提示并禁用input,否则监听input的change事件。

var result = document.getElementById("result");
var input = document.getElementById("file_input");

if(typeof FileReader==='undefined'){
	result.innerHTML = "抱歉,你的浏览器不支持 FileReader";
	input.setAttribute('disabled','disabled');
}else{
	input.addEventListener('change',readFile,false);
}

然后,当file_input的change事件触发时,调用函数readFile()。在readFile中,我们首先获取file对象,然后通过file的type属性来检测文件类型,我们当然只允许选择图像类型的文件,然后我们new一个FileReader实例,并调用readAsDataURL方法来读取选中的图像文件,最后在onload事件中,获取到成功读取的文件内容,并以插入一个img节点的方式显示选中的图片。

function readFile(){
	var file = this.files[0];
	if(!/image\/\w+/.test(file.type)){
		alert("文件必须为图片!");
		return false;
	}
	var reader = new FileReader();
	reader.readAsDataURL(file);
	reader.onload = function(e){
		result.innerHTML = '<img src="'+this.result+'" alt=""/>'
	}
}

怎么样,可以看来我们并没有和后台交互就能将本地图片显示在页面中,最后我们来了解下FileReader的方法和事件。

FileReader的方法和事件

参数/事件 描述
方法
abort 中断读取
readAsText(file, [encoding]) 将文件读取为文本
该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。
readAsBinaryString(file) 将文件读取二进制码
通常我们将它传送到后端,后端可以通过这段字符串存储文件
readAsDataURL(file) 将文件读取为DataURL
将文件读取为一串Data URL字符串,将小文件以一种特殊格式的URL地址直接读入页面。小文件指图像与html等格式的文件。
事件
onabort 数据读取中断时触发
onerror 数据读取出错时触发
onloadstart 数据读取开始时触发
onload 数据读取成功完成时触发
onloadend 数据读取完成时触发,无论成功失败
声明:本文为原创文章,helloweba.net和作者拥有版权,如需转载,请注明来源于helloweba.net并保留原文链接:https://www.helloweba.net/javascript/224.html

23条评论

  • 这个的如果你删除图片后想在上传这个图片就不行了,怎麼解决

  • https://developer。mozilla。org/zh-CN/docs/Web/API/FileReader 这是个好地方, 看看这里就明白了. 另外其实如果不懂的话用谷歌调试工具来个debug打个断点看一下就明白了.

  • https://developer。mozilla。org/zh-CN/docs/Web/API/FileReader 这是个好地方, 看看这里就明白了. 另外其实如果不懂的话用谷歌调试工具来个debug打个断点看一下就明白了.

  • 这里的this实际上FileReader对象, reader.onload = function(e){
    result.innerHTML = '<img src="'+this.result+'" alt=""/>'
    }
    这个代码的函数在reader的onload事件发生时调用, 所以this不就是reader对象吗? 至于FileReader的result属性代表的是: 读取到的文件内容.这个属性只在读取操作完成之后才有效,并且数据的格式取决于读取操作是由哪个方法发起的. (只读属性).

  • 兼容效果好些不咋地

  • result是FileReader这个构造函数里面的一个属性;它的值是这个本地图片的信息

  • 请问最后那个tihs.result。从哪里出来的???

  • this.files未定义,你的input框改名了吧没获取到input的文件

  • 用JS或者JQuery模拟点击inputfile就行了啊[挖鼻屎]

  • 现在页面设计师不会直接让inputFile框显示 都是利用inputButton去触发inputFile 不能够用onchange事件怎么解决

  • YUUYIKUOLIP;PO['PO-0[

  • TYJYUJIY7I7Y

  • SDFSTGRGHTRY

  • 最近要做图片能旋转的功能,到处找资料,但还是不明所以

  • TypeError: this.files is undefined 报了一个这个错 。直接拿你这个用的 。求大神

  • 值得收藏!这篇文章很不错!

  • 值得收藏!这篇文章很不错!

  • http://wei.wuwangbiao.com

  • 技术文章哦,真的有点看不懂

  • 人托人