大家好 !!  又见面了, 今天我们来搞一搞   H5的新增API    FileReader     真是一个超级超级方便的API呢!!!很多场景都可以使用..........

我们先不赘述MDN文档里的内容, 我们从  1  到  0, 从 一个 小Demo 入手 开始 了解 它;

请开始你的表演:

是不是简单又炫酷, 我们从头开始来看, 界面分三个部分

1   文件input框

2    预览部分

3   进度条

HTML代码:

  1. <div class="file-preview">
  2. <div class="add" style="width: 50px;height: 50px;line-height: 50px;text-align: center;background-color: #eeeeee;position: relative;" >
  3. +
  4. <input type="file" id="fileInput" style="opacity: 0;z-index: 1;position: absolute;top: 0;left: 0;width: 100%;height: 100%;cursor: pointer;">
  5. </div>
  6. <div class="image-box" style="margin-top: 20px;height: 200px;line-height: 0">
  7. <img src="" alt="" style="max-height: 200px;display: none" id="image">
  8. <video src="" controls style="display: none;" height="200"></video>
  9. </div>
  10. <div class="progress" style="background-color: #cccccc;width: 700px;height: 20px;position: relative;text-align: center;line-height: 20px;margin-top: 20px;">
  11. <span id="percent">0%</span>
  12. <div class="loading" style="position: absolute;height: 100%;background-color: blue;top: 0;left: 0;"></div>
  13. </div>
  14. </div>

HTML结构应该很清晰吧,  我们重点讲js部分

First      获取要操作的Dom元素

    

  1. var img = document.querySelector('#image'); // 获取image
  2.  
  3. var video = document.querySelector('video'); // 获取video
  4.  
  5. var input = document.querySelector('#fileInput'); // 获取input
  6.  
  7. var loading = document.querySelector('.loading'); // 获取进度条
  8.  
  9. var percent = document.querySelector('#percent'); // 获取百分比
  10.  
  11. var reader = new FileReader(); // 初始化一个 FileReader
  12.  
  13. var file = {}; // 文件对象
  14.  
  15. var fileType = ''; // 文件类型

Second    监听input 上的change事件   ,  获取选择的本地文件

  1. input.addEventListener('change', function(event) {
  2. file = event.target.files[0]; // 获取文件对象
  3. video.style.display = 'none'; // 隐藏video
  4. img.style.display = 'none'; // 隐藏image
  5. percent.innerHTML = '0%'; // 初始化百分比
  6. loading.style.width = '0px'; // 初始化进度条
  7. if (event.target.files.length) {
  8. fileType = file.type.split('/')[0]; // 获取文件类型
  9. reader.readAsDataURL(file); // 开始读取文件
  10. }
  11. });

 fileReader 上   readAsDataURL() 方法是把文件 转换成 一个 base64编码的字符串,可以放在图片或者视频的src里, 最常用

        readAsText()  把文件 转换成 一个特定编码格式的字符串, 没有指定编码格式默认为utf-8  常用

        readAsBinaryString()  把文件 转化成一个二进制数据  了解即可

        readAsArrayBuffer() 把文件 转换成一个 ArrayBuffer 数据  了解即可

 

 这些方法转换后的数据都在FileReader.result上    ,还有一个终止读取的方法   abort()

  继续正题.................

Third    文件开始读取后    FileRead 给我们提供了   读取   状态  的 事件    , 我们绑定这些事件来看看效果:

  1. reader.onabort = function (e) { // 终止读取触发 abort()方法会触发它
  2. console.log('abort')
  3. };
  4.  
  5. reader.onloadstart = function (e) { // 开始读取触发
  6. console.log('start')
  7. };
  8.  
  9. reader.onprogress = function (e) { // 读取过程触发 可以获得读取进度
  10.  
  11. percent.innerHTML = (e.loaded/e.total).toFixed(2) * 100 + '%'; // 进度百分比
  12.  
  13. loading.style.width = (e.loaded/e.total) * 700 + 'px'; // 进度百分比 乘 总宽度 等于 进度条的宽度
  14. };
  15.  
  16. reader.onload = function (e) { // 读取结束并且读取成功触发 在这里可以拿到result
  17. console.log('loaded');
  18. loading.style.width = '700px'; // 进度条完成
  19. percent.innerHTML = '100%'; // 百分比完成
  20. if (fileType === 'video') {
  21. video.src = this.result;
  22. video.style.display = 'block' // 显示视频
  23. } else if (fileType === 'image'){
  24. img.src = this.result;
  25. img.style.display = 'block' // 显示图片
  26. }
  27. };
  28.  
  29. reader.onloadend = function (e) { // 读取结束触发 , 在load之后
  30. console.log('end')
  31. };

这里要注意一点,  load 是读取成功触发,   loadend 不管读取成功或者失败都会触发,

所以我们在load  里拿到转化结果。

到此   demo  就做完啦!!!!!!!

同学们学会了吗,

最后提一嘴,  虽然FileReader 很好用     ,  但是  ————————————

————————   base64转码很费时间, 如果文件非常大的话, 很慢。。。。。

还有可能转不出来。。。。。

这种情况  推荐使用    URL.createObjectURL(file)创建一个DOMString, 直接使用这个DOMString 就好啦,

使用完记得 使用   URL.revokeObjectURL()   清掉

本期讲解到此结束, 我们下期再见  。

H5 新特性之 fileReader 实现本地图片视频资源的预览的更多相关文章

  1. JS兼容各个浏览器的本地图片上传即时预览效果

    JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...

  2. JS兼容各个浏览器的本地图片上传即时预览效果\、

    在firefox\chrome\ie10等浏览器中可以使用HTML5中的内容实现图片即时预览效果,在IE10以下浏览器中使用滤镜来解决图片显示问题. HTML5中的FileReader对象主要是把文件 ...

  3. 用FileReader对象获取图片base64代码并预览

    MDN中FileReader的详细介绍: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader 用FileReader获取图片base ...

  4. 使用input选择本地图片,并且实现预览功能

    1.使用input标签选择本地图片文件 用一个盒子来存放预览的图片 2.JS实现预览 首先添加一个input change事件,再用到 URL.createObjectURL() 方法 用来创建 UR ...

  5. H5新特性汇总

    H5新特性: 新增选择器 document.querySelector.document.querySelectorAll 拖拽释放(Drag and drop) API 媒体播放的 video 和 ...

  6. H5新特性-视频,音频-Flash-canvas绘图

    json格式 json - > AJAX json:数据格式,通常是以字符串形式表示 对象 {"name":"james","age" ...

  7. H5新特性--WebStorage--WebSocke

    今天的目标 3.2:h5新特性--WebStorage localStorage  在客户端浏览器保存数据 永久保存 保存数据 localStorage [key] = value 保存数据 loca ...

  8. H5新特性---Web Worker---Web Stroage

    今天的目标 3.1:h5新特性八--Web Worker---代码就3行 程序:program 存储在外存(磁盘)中代码 进程:Process/Task 将程序调用内存中,分配空间 线程:Thread ...

  9. H5新特性---SVG--椭圆--直线--文本--滤镜(高斯滤镜--模糊)--地理定位

    今天的目标 3.1:h5新特性--SVG--椭圆 <ellipse rx="" ry=""  cx="" cy="" ...

随机推荐

  1. the import java.util.* cannot be resolve,怎么解决

    我碰到这个问题是因为重装系统后,原先的JDK6换成了JDK7, Eclipse中的旧项目中jsp文件的此类import出现错误提示.在以下页面找到解决方案,专贴出来: http://www.myexc ...

  2. java运行机制、Jdk版本及Java环境变量

    一.语言特性 计算机高级语言按程序的执行方式可分为:编译型和解释型两种.编译型的语言是指使用专门的编译器,针对特定的平台(操作系统)一次性翻译成被该平台硬件执行的机器码,并包装成该平台可执行性程序文件 ...

  3. flush()清空文件缓存区

    # 缓冲区:cpu 一级缓存 二级缓存 三级缓存 import time f =open('2.txt','a+' ,encoding='utf-8') f.write('helloworld\n') ...

  4. Android 开发知识体系

    知识体系 1.Unix/Linux平台技术:基本命令,Linux下的开发环境 2.企业级数据库技术:SQL语言.SQL语句调优.Oracle数据库技术 3.Java 语言核心技术:Java语言基础.J ...

  5. DataTime显示格式【转】

    随心所欲的DateTime显示格式 任何项目,难免会碰到DateTime的显示问题,.net框架虽提供丰富多样的显示方法,但我很少使用,因老忘记细节,每次都要纠结到底月份在前还是年份在前:日期分隔符到 ...

  6. jsoncpp linux平台编译和arm移植

    下载 http://sourceforge.net/projects/jsoncpp/ 或者 http://download.csdn.net/detail/chinaeran/8631141 Lin ...

  7. .NET开发微信小程序-生成二维码

    1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...

  8. OVMF基础

    什么是OVMF The Open Virtual Machine Firmware (OVMF) project aims to support firmware for Virtual Machin ...

  9. Flask开发微电影网站(一)

    1.用到的Flask知识 1.使用整形,浮点型,路径型,字符串型下正则表达式路由转化器 2.使用GET与POST请求,上传文件,cookie获取与响应,404处理 3.使用模板自动转义,定义过滤器,定 ...

  10. GO安全并发之无锁原子操作

    声明:本文是<Go并发编程实战>的样章,禁止以任何形式转载此文. 摘要: 我们已经知道,原子操作即是进行过程中不能被中断的操作.也就是说,针对某个值的原子操作在被进行的过程当中,CPU绝不 ...