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函数代码
Apr 17 Javascript
一个简单的弹性返回顶部JS代码实现介绍
Jun 09 Javascript
javascript中call和apply方法浅谈
Sep 27 Javascript
js实现顶部可折叠的菜单工具栏效果实例
May 09 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
Aug 31 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
Aug 23 Javascript
JavaScript数据结构之单链表和循环链表
Nov 28 Javascript
Vue中使用vee-validate表单验证的方法
May 09 Javascript
React学习笔记之高阶组件应用
Jun 02 Javascript
jquery轻量级数字动画插件countUp.js使用详解
Oct 17 jQuery
p5.js绘制创意自画像
Nov 04 Javascript
vue分页插件的使用方法
Dec 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
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
js实现点击烟花特效
2020/10/14 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
matplotlib设置legend图例代码示例
2017/12/19 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
NumPy排序的实现
2020/01/21 Python
Python包和模块的分发详细介绍
2020/06/19 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
销售类个人求职信范文
2013/09/25 职场文书
幼儿园中班新学期寄语
2014/01/18 职场文书
《乡愁》教学反思
2014/02/18 职场文书
村级个人对照检查材料
2014/08/22 职场文书
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL