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 相关文章推荐
使用js简单实现了tree树菜单
Nov 20 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
Aug 07 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
Angular ui.bootstrap.pagination分页
Jan 20 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
js实现从左向右滑动式轮播图效果
Jul 07 Javascript
vue2.0 computed 计算list循环后累加值的实例
Mar 07 Javascript
浅析Vue实例以及生命周期
Aug 14 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
Oct 25 Javascript
微信小程序事件 bindtap bindinput代码实例
Aug 26 Javascript
JS快速实现简单计算器
Apr 08 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
Jun 05 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
PHP简单获取视频预览图的方法
2015/03/12 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
javascript实现右下角广告框效果
2017/02/01 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
python实现多人聊天室
2020/03/31 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
同学聚会老师邀请函
2014/01/28 职场文书
学生会招新策划书
2014/02/14 职场文书
美术课外活动总结
2014/07/08 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server