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注入技巧
Jun 22 Javascript
js中Image对象以及对其预加载处理示例
Nov 20 Javascript
JS实现模仿微博发布效果实例代码
Dec 16 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
Sep 06 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
使用JavaScript开发IE浏览器本地插件实例
Feb 18 Javascript
javascript实现无缝上下滚动特效
Dec 16 Javascript
hovertree插件实现二级树形菜单(简单实用)
Dec 28 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
Apr 17 Javascript
移动端吸顶fixbar的解决方案详解
Jul 17 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
Jul 17 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 开源AJAX框架14种
2009/08/24 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
PHP封装的HttpClient类用法实例
2015/06/17 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
JS判断数组那点事
2017/10/10 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python 中的with关键字使用详解
2016/09/11 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
预备党员思想汇报范文
2013/12/29 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL