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编辑器和代码格式化
Apr 25 Javascript
js实现的点击数量加一可操作数据库
May 09 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
Jun 07 Javascript
js获取会话框prompt的返回值的方法
Jan 10 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
Mar 04 Javascript
基于insertBefore制作简单的循环插空效果
Sep 21 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
Jan 06 Javascript
使用Javascript简单计算器
Nov 17 Javascript
微信小程序 setData 对 data数据影响问题
Apr 18 Javascript
vue中监听路由参数的变化及方法
Dec 06 Javascript
js实现二级联动简单实例
Jan 11 Javascript
vue 自定义组件的写法与用法详解
Mar 04 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设计模式 注册表模式
2012/02/05 PHP
JS中encodeURIComponent函数用php解码的代码
2012/03/01 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
JavaScript错误处理
2015/02/03 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python判断两个对象相等的原理
2017/12/12 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
python打开windows应用程序的实例
2019/06/28 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
实现Python与STM32通信方式
2019/12/18 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
Python中有几个关键字
2020/06/04 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
幼儿园教师辞职信
2014/01/18 职场文书
协议书怎么写
2014/04/21 职场文书
实验心得体会
2014/09/05 职场文书
2015年项目工作总结
2015/04/29 职场文书
单位收入证明范本
2015/06/18 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript