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 相关文章推荐
javascript事件问题
Sep 05 Javascript
WEB 浏览器兼容 推荐收藏
May 14 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
JS实现简易图片轮播效果的方法
Mar 25 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
Mar 31 Javascript
Bootstrap基本布局实现方法详解
Nov 25 Javascript
BootstrapValidator超详细教程(推荐)
Dec 07 Javascript
Vue resource中的GET与POST请求的实例代码
Jul 21 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
Nov 21 Javascript
Vue代码分割懒加载的实现方法
Nov 23 Javascript
微信小程序和百度的语音识别接口详解
May 06 Javascript
layui禁用侧边导航栏点击事件的解决方法
Sep 25 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设计模式 php实现工厂模式(factory)
2015/12/07 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
利用python写个下载teahour音频的小脚本
2017/05/08 Python
Python中作用域的深入讲解
2018/12/10 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
小学生感恩父母演讲稿
2014/08/28 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
通知范文怎么写
2015/04/16 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
Python echarts实现数据可视化实例详解
2022/03/03 Python
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL