JS中利用FileReader实现上传图片前本地预览功能


Posted in Javascript onMarch 02, 2018

引子

      平时做图片上传预览时如果没有特殊的要求就直接先把图片传到后台去,成功之后拿到URL再渲染到页面上,这样做在图片比较小的时候没什么问题,大一点的话就会比较慢才能看到预览了,而且还产生了垃圾文件,所以比较好的是上传之前先在本地预览一下。

      之前做项找插件的时候就知道纯前端可以实现图片本地预览,可今天面试的时候被问到时竟然一脸懵逼,然后竟然无意中就在电脑桌面发现了实现的demo,然后根据demo查了一下API,稍微总结下:

首先得拿到File对象

      当用input标签上传图片时event对象中会包含file对象的一个集合

event.target.files

核心是FileReader对象

根据MDN上的说法:

FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

首先要作为构造函数得到一个FileReader的实例对象

var freader = new FileReader();

利用readAsDataURL()方法读取指定的内容

freader.readAsDataURL(file);

最后就是一个事件处理,相当于监控读取进度,我们这里是当读取完成时渲染图片,所以用onload

freader.onload = function(e) { console.log(e); myImg.setAttribute('src', e.target.result); }

这里架加载完成之后最终得到的是一个base64编码的src地址,具体为什么下次查清楚了再专门写篇关于base64编码的文章

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <form action=""> 
 <input type="file" name="files" id="fileTog" accept="image/*" multiple="multiple" onchange="changImg(event)"> 
 <img alt="暂无图片" id="myImg" src="" height="100px" width="100px"> 
 </form>
 <script>
 function changImg(e){ 
 var myImg = document.getElementById('myImg');
 for (var i = 0; i < e.target.files.length; i++) { 
 var file = e.target.files[i]; 
 console.log(file); 
 if (!(/^image\/.*$/i.test(file.type))) { 
  continue; //不是图片 就跳出这一次循环 
 } 
 //实例化FileReader API 
 var freader = new FileReader(); 
 freader.readAsDataURL(file); 
 freader.onload = function(e) { 
  console.log(e);
  myImg.setAttribute('src', e.target.result); 
 } 
 } 
 }
 </script>
</body>
</html>

后记

      通过这件事就暴露了我学习新东西的一个问题,就是查出来看一遍觉得知道了就行了,这种习惯是特别害人的,以后每当有个疑问查出来之后不仅要查是怎么做的,还要了解一下为什么可以这么做,所谓知其然知其所以然。还有就是平时的代码能用手敲的尽量别复制,复制一时是爽了,可要手写的时候写不出来也是听尴尬的。

      今天是来杭州的第三天,面试的第二天,这两天的面试中暴露出的一个重要问题就是平时太依赖搜索引擎,用脑太少,连一些简单API就没记全,前端确实还是有很多东西就是要牢牢记住的,没什么捷径可走,这些东西就是基础,没记住就是基础差。虽然你并不影响你做出东西来,但会影响开发效率,技术要往上走,这个基石必须稳,加油记吧!

总结

以上所述是小编给大家介绍的JS中利用FileReader实现上传图片前本地预览,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
gridpanel动态加载数据的实例代码
Jul 18 Javascript
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
javascript实现分栏显示小技巧附图
Oct 13 Javascript
js省市联动效果完整实例代码
Dec 09 Javascript
JavaScript必知必会(九)function 说起 闭包问题
Jun 08 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
Sep 08 Javascript
jQuery下拉菜单的实现代码
Nov 03 Javascript
JS如何生成一个不重复的ID的函数
Dec 25 Javascript
jQuery加密密码到cookie的实现代码
Apr 18 jQuery
vue中设置、获取、删除cookie的方法
Sep 21 Javascript
在layui框架中select下拉框监听更改事件的例子
Sep 20 Javascript
Javascript中async与await的捕捉错误详解
Mar 03 Javascript
select标签设置默认选中的选项方法
Mar 02 #Javascript
原生JavaScript实现todolist功能
Mar 02 #Javascript
js判断输入框不能为空格或null值的实现方法
Mar 02 #Javascript
vue判断input输入内容全是空格的方法
Mar 02 #Javascript
Spring Boot/VUE中路由传递参数的实现代码
Mar 02 #Javascript
vue项目tween方法实现返回顶部的示例代码
Mar 02 #Javascript
Vue2.0系列之过滤器的使用
Mar 01 #Javascript
You might like
深入了解php4(1)--回到未来
2006/10/09 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
2016/07/12 Python
python决策树之C4.5算法详解
2017/12/20 Python
Python使用遗传算法解决最大流问题
2018/01/29 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
python实现简易淘宝购物
2019/11/22 Python
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
农村改厕实施方案
2014/03/22 职场文书
学生保证书范文
2014/04/28 职场文书
车辆工程专业求职信
2014/06/14 职场文书
企业介绍信范文
2015/01/30 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书