H5 新特性之 fileReader 实现本地图片视频资源的预览
大家好 !! 又见面了, 今天我们来搞一搞 H5的新增API FileReader 真是一个超级超级方便的API呢!!!很多场景都可以使用..........
我们先不赘述MDN文档里的内容, 我们从 1 到 0, 从 一个 小Demo 入手 开始 了解 它;
请开始你的表演:

是不是简单又炫酷, 我们从头开始来看, 界面分三个部分
1 文件input框
2 预览部分
3 进度条
HTML代码:
<div class="file-preview">
<div class="add" style="width: 50px;height: 50px;line-height: 50px;text-align: center;background-color: #eeeeee;position: relative;" >
+
<input type="file" id="fileInput" style="opacity: 0;z-index: 1;position: absolute;top: 0;left: 0;width: 100%;height: 100%;cursor: pointer;">
</div>
<div class="image-box" style="margin-top: 20px;height: 200px;line-height: 0">
<img src="" alt="" style="max-height: 200px;display: none" id="image">
<video src="" controls style="display: none;" height="200"></video>
</div>
<div class="progress" style="background-color: #cccccc;width: 700px;height: 20px;position: relative;text-align: center;line-height: 20px;margin-top: 20px;">
<span id="percent">0%</span>
<div class="loading" style="position: absolute;height: 100%;background-color: blue;top: 0;left: 0;"></div>
</div>
</div>
HTML结构应该很清晰吧, 我们重点讲js部分
First 获取要操作的Dom元素
var img = document.querySelector('#image'); // 获取image
var video = document.querySelector('video'); // 获取video
var input = document.querySelector('#fileInput'); // 获取input
var loading = document.querySelector('.loading'); // 获取进度条
var percent = document.querySelector('#percent'); // 获取百分比
var reader = new FileReader(); // 初始化一个 FileReader
var file = {}; // 文件对象
var fileType = ''; // 文件类型
Second 监听input 上的change事件 , 获取选择的本地文件
input.addEventListener('change', function(event) {
file = event.target.files[0]; // 获取文件对象
video.style.display = 'none'; // 隐藏video
img.style.display = 'none'; // 隐藏image
percent.innerHTML = '0%'; // 初始化百分比
loading.style.width = '0px'; // 初始化进度条
if (event.target.files.length) {
fileType = file.type.split('/')[0]; // 获取文件类型
reader.readAsDataURL(file); // 开始读取文件
}
});
fileReader 上 readAsDataURL() 方法是把文件 转换成 一个 base64编码的字符串,可以放在图片或者视频的src里, 最常用
readAsText() 把文件 转换成 一个特定编码格式的字符串, 没有指定编码格式默认为utf-8 常用
readAsBinaryString() 把文件 转化成一个二进制数据 了解即可
readAsArrayBuffer() 把文件 转换成一个 ArrayBuffer 数据 了解即可
这些方法转换后的数据都在FileReader.result上 ,还有一个终止读取的方法 abort()
继续正题.................
Third 文件开始读取后 FileRead 给我们提供了 读取 状态 的 事件 , 我们绑定这些事件来看看效果:
reader.onabort = function (e) { // 终止读取触发 abort()方法会触发它
console.log('abort')
};
reader.onloadstart = function (e) { // 开始读取触发
console.log('start')
};
reader.onprogress = function (e) { // 读取过程触发 可以获得读取进度
percent.innerHTML = (e.loaded/e.total).toFixed(2) * 100 + '%'; // 进度百分比
loading.style.width = (e.loaded/e.total) * 700 + 'px'; // 进度百分比 乘 总宽度 等于 进度条的宽度
};
reader.onload = function (e) { // 读取结束并且读取成功触发 在这里可以拿到result
console.log('loaded');
loading.style.width = '700px'; // 进度条完成
percent.innerHTML = '100%'; // 百分比完成
if (fileType === 'video') {
video.src = this.result;
video.style.display = 'block' // 显示视频
} else if (fileType === 'image'){
img.src = this.result;
img.style.display = 'block' // 显示图片
}
};
reader.onloadend = function (e) { // 读取结束触发 , 在load之后
console.log('end')
};
这里要注意一点, load 是读取成功触发, loadend 不管读取成功或者失败都会触发,
所以我们在load 里拿到转化结果。
到此 demo 就做完啦!!!!!!!
同学们学会了吗,
最后提一嘴, 虽然FileReader 很好用 , 但是 ————————————
———————— base64转码很费时间, 如果文件非常大的话, 很慢。。。。。
还有可能转不出来。。。。。
这种情况 推荐使用 URL.createObjectURL(file)创建一个DOMString, 直接使用这个DOMString 就好啦,
使用完记得 使用 URL.revokeObjectURL() 清掉
本期讲解到此结束, 我们下期再见 。
H5 新特性之 fileReader 实现本地图片视频资源的预览的更多相关文章
- JS兼容各个浏览器的本地图片上传即时预览效果
JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...
- JS兼容各个浏览器的本地图片上传即时预览效果\、
在firefox\chrome\ie10等浏览器中可以使用HTML5中的内容实现图片即时预览效果,在IE10以下浏览器中使用滤镜来解决图片显示问题. HTML5中的FileReader对象主要是把文件 ...
- 用FileReader对象获取图片base64代码并预览
MDN中FileReader的详细介绍: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader 用FileReader获取图片base ...
- 使用input选择本地图片,并且实现预览功能
1.使用input标签选择本地图片文件 用一个盒子来存放预览的图片 2.JS实现预览 首先添加一个input change事件,再用到 URL.createObjectURL() 方法 用来创建 UR ...
- H5新特性汇总
H5新特性: 新增选择器 document.querySelector.document.querySelectorAll 拖拽释放(Drag and drop) API 媒体播放的 video 和 ...
- H5新特性-视频,音频-Flash-canvas绘图
json格式 json - > AJAX json:数据格式,通常是以字符串形式表示 对象 {"name":"james","age" ...
- H5新特性--WebStorage--WebSocke
今天的目标 3.2:h5新特性--WebStorage localStorage 在客户端浏览器保存数据 永久保存 保存数据 localStorage [key] = value 保存数据 loca ...
- H5新特性---Web Worker---Web Stroage
今天的目标 3.1:h5新特性八--Web Worker---代码就3行 程序:program 存储在外存(磁盘)中代码 进程:Process/Task 将程序调用内存中,分配空间 线程:Thread ...
- H5新特性---SVG--椭圆--直线--文本--滤镜(高斯滤镜--模糊)--地理定位
今天的目标 3.1:h5新特性--SVG--椭圆 <ellipse rx="" ry="" cx="" cy="" ...
随机推荐
- 在MySQL和PostgreSQL之外,为什么阿里要研发HybridDB数据库?
http://www.infoq.com/cn/news/2016/12/MySQL-PostgreSQL-Greenplum 编者按 在大数据火遍IT界之前,大家对数据信息的挖掘通常聚焦在BI(Bu ...
- svn Server sent unexpected return value (403 Forbidden) in response to CHECKOUT
今天,提交資料到公司svn服務器,但是一直提示 Server sent unexpected return value (403 Forbidden) in response to CHECKOUT ...
- ws-trust、域、webservice接口的总结
最近燃料公司门户做了一个待办的汇总,从三个数据源拿数据汇总到首页,这三个数据源分别是域认证的接口,域认证的webservices,证书加密的接口,下面就这些接口,做一下简单总结 1 pfx证书的探索过 ...
- php中$_FILES应用实例
允许用户从表单上传文件是非常有用的.先来看一段HTML表单代码 <html> <body> <form action="upload_file.php" ...
- MySQL分组、链接的使用
一.深入学习 group by group by ,分组,顾名思义,把数据按什么来分组,每一组都有什么特点. 1.我们先从最简单的开始: select count(*) from tb1 group ...
- Caffe 编译后 make runtest 出现locale::facet::_S_create_c_locale 错误
You might need to append LC_ALL="en_US.UTF-8" to file: /etc/default/locale and reboot your ...
- github routine
1. 从官方库fork 自己的分支库后,git clone到local. 2. local的remotes/origin默认是自己的分支库.可以添加remotes/upstream指向官方库. 3. ...
- ES的基本用法
ES的基本概念 1> 集群和节点 一个es集群是由一个或多和es节点组成的集合 每一个集群都有一个名字, 如之前的wali 每个节点都有自己的名字, 如之前的master, slave1, sl ...
- PAT1106:Lowest Price in Supply Chain
1106. Lowest Price in Supply Chain (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CH ...
- macbook 添加快捷启动服务
来至 Mac OS X: Launch Terminal from keyboard shortcut os x 上很多功能都可以通过Apple自家的Automator.app创建,且使用此方法可以为 ...