转载至 : http://www.360doc.com/content/14/0214/18/1457948_352511416.shtml

FileReader 资料(英文) : https://developer.mozilla.org/en-US/docs/Web/API/FileReader#State_constants

HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型。

FileReader的使用方式非常简单,可以按照如下步骤创建FileReader对象并调用其方法:

1.检测浏览器对FileReader的支持

[javascript] view plaincopy

  1. if(window.FileReader) {
  2. var fr = new FileReader();
  3. // add your code here
  4. }
  5. else {
  6. alert("Not supported by your browser!");
  7. }

2. 调用FileReader对象的方法

FileReader 的实例拥有 4 个方法,其中 3 个用以读取文件,另一个用来中断读取。下面的表格列出了这些方法以及他们的参数和功能,需要注意的是 ,无论读取成功或失败,方法并不会返回读取结果,这一结果存储在 result属性中。

方法名 参数 描述
abort none 中断读取
readAsBinaryString file 将文件读取为二进制码
readAsDataURL file 将文件读取为 DataURL
readAsText file, [encoding] 将文件读取为文本

readAsText:该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。
readAsBinaryString:该方法将文件读取为二进制字符串,通常我们将它传送到后端,后端可以通过这段字符串存储文件。
readAsDataURL:这是例子程序中用到的方法,该方法将文件读取为一段以 data: 开头的字符串,这段字符串的实质就是 Data URL,Data URL是一种将小文件直接嵌入文档的方案。这里的小文件通常是指图像与 html 等格式的文件。

3. 处理事件

FileReader 包含了一套完整的事件模型,用于捕获读取文件时的状态,下面这个表格归纳了这些事件。

事件 描述
onabort 中断时触发
onerror 出错时触发
onload 文件读取成功完成时触发
onloadend 读取完成触发,无论成功或失败
onloadstart 读取开始时触发
onprogress 读取中

文件一旦开始读取,无论成功或失败,实例的 result 属性都会被填充。如果读取失败,则 result 的值为 null ,否则即是读取的结果,绝大多数的程序都会在成功读取文件的时候,抓取这个值。

[javascript] view plaincopy

  1. fr.onload = function() {
  2. this.result;
  3. };

下面通过一个上传图片预览和带进度条上传来展示FileReader的使用。

  1. <script type="text/javascript">
  2. function showPreview(source) {
  3. var file = source.files[0];
  4. if(window.FileReader) {
  5. var fr = new FileReader();
  6. fr.onloadend = function(e) {
  7. document.getElementById("portrait").src = e.target.result;
  8. };
  9. fr.readAsDataURL(file);
  10. }
  11. }
  12. </script>
  13. <input type="file" name="file" onchange="showPreview(this)" />
  14. <img id="portrait" src="" width="70" height="75">

如果要限定上传文件的类型,可以通过文件选择器获取文件对象并通过type属性来检查文件类型

[javascript] view plaincopy

  1. if(!/image\/\w+/.test(file.type)){
  2. alert("请确保文件为图像类型");
  3. return false;
  4. }

不难发现这个检测是基于正则表达式的,因此可以进行各种复杂的匹配,非常有用。

如果要增加一个进度条,可以使用HTML 5的progress标签,通过下面的代码实现。

  1. <form>
  2. <fieldset>
  3. <legend>分度读取文件:</legend>
  4. <input type="file" id="File" />
  5. <input type="button" value="中断" id="Abort" />
  6. <p>
  7. <label>读取进度:</label><progress id="Progress" value="0" max="100"></progress>
  8. </p>
  9. <p id="Status"></p>
  10. </fieldset>
  11. </form>
[javascript] view plaincopy

  1. var h = {
  2. init: function() {
  3. var me = this;
  4. document.getElementById('File').onchange = me.fileHandler;
  5. document.getElementById('Abort').onclick = me.abortHandler;
  6. me.status = document.getElementById('Status');
  7. me.progress = document.getElementById('Progress');
  8. me.percent = document.getElementById('Percent');
  9. me.loaded = 0;
  10. //每次读取1M
  11. me.step = 1024 * 1024;
  12. me.times = 0;
  13. },
  14. fileHandler: function(e) {
  15. var me = h;
  16. var file = me.file = this.files[0];
  17. var reader = me.reader = new FileReader();
  18. //
  19. me.total = file.size;
  20. reader.onloadstart = me.onLoadStart;
  21. reader.onprogress = me.onProgress;
  22. reader.onabort = me.onAbort;
  23. reader.onerror = me.onerror;
  24. reader.onload = me.onLoad;
  25. reader.onloadend = me.onLoadEnd;
  26. //读取第一块
  27. me.readBlob(file, 0);
  28. },
  29. onLoadStart: function() {
  30. var me = h;
  31. },
  32. onProgress: function(e) {
  33. var me = h;
  34. me.loaded += e.loaded;
  35. //更新进度条
  36. me.progress.value = (me.loaded / me.total) * 100;
  37. },
  38. onAbort: function() {
  39. var me = h;
  40. },
  41. onError: function() {
  42. var me = h;
  43. },
  44. onLoad: function() {
  45. var me = h;
  46. if(me.loaded < me.total) {
  47. me.readBlob(me.loaded);
  48. } else {
  49. me.loaded = me.total;
  50. }
  51. },
  52. onLoadEnd: function() {
  53. var me = h;
  54. },
  55. readBlob: function(start) {
  56. var me = h;
  57. var blob,
  58. file = me.file;
  59. me.times += 1;
  60. if(file.webkitSlice) {
  61. blob = file.webkitSlice(start, start + me.step + 1);
  62. } else if(file.mozSlice) {
  63. blob = file.mozSlice(start, start + me.step + 1);
  64. }
  65. me.reader.readAsText(blob);
  66. },
  67. abortHandler: function() {
  68. var me = h;
  69. if(me.reader) {
  70. me.reader.abort();
  71. }
  72. }
  73. };
  74. h.init();

HTML5 之 FileReader 的使用 (网页上图片拖拽并且预显示可在这里学到) [转载]的更多相关文章

  1. HTML5 之 FileReader 的使用 (二) (网页上图片拖拽并且预显示可在这里学到) [转载]

    转载至 : http://www.360doc.com/content/14/0214/18/1457948_352511645.shtml FileReader 资料(英文): https://de ...

  2. CSS 奇思妙想 | 使用 resize 实现强大的图片拖拽切换预览功能

    本文将介绍一个非常有意思的功能,使用纯 CSS 利用 resize 实现强大的图片切换预览功能.类似于这样: 思路 首先,要实现这样一个效果如果不要求可以拖拽,其实有非常多的办法. 将两张图片叠加在一 ...

  3. FileReader (三) - 网页拖拽并预显示图片简单实现

    以下是一个很贱很简单的一个 在网页上图拽图片并预显示的demo. 我是从https://developer.mozilla.org/en-US/docs/Web/API/FileReader#Stat ...

  4. HTML5多图片拖拽上传带进度条

    前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...

  5. HTML5图片拖拽预览原理及实现

    一.前言 这两天恰好有一位同事问我怎样做一个图片预览功能.作为现代人的我们首先想到的当然是HTML5啦,其实HTML5做图片预览已经是一个老生常谈的问题了.我在这里就简单说说其中相关的一些东西,当然会 ...

  6. 自制一个H5图片拖拽、裁剪插件(原生JS)

    前言 如今的H5运营活动中,有很多都是让用户拍照或者上传图片,然后对照片加滤镜.加贴纸.评颜值之类的.尤其是一些拍照软件公司的运营活动几乎全部都是这样的. 博主也做过不少,为了省事就封装了一个简单的图 ...

  7. canvas 图片拖拽旋转之二——canvas状态保存(save和restore)

    引言 在上一篇日志“canvas 图片拖拽旋转之一”中,对坐标转换有了比较深入的了解,但是仅仅利用坐标转换实现的拖拽旋转,会改变canvas坐标系的状态,从而影响画布上其他元素的绘制.因此,这个时候需 ...

  8. canvas 图片拖拽旋转之一——坐标转换translate

    引言 对canvas中绘制的图片进行旋转操作,需要使用ctx.translate变换坐标系,将图片旋转的基点设为坐标系的原点,然后ctx.rotate旋转. 这个时候,因为canvas坐标系发生了旋转 ...

  9. javascript小实例,PC网页里的拖拽

    几年前,我参与设计开发一个房产网的项目,我负责前端工作,由于项目经理要求比较高,参考了很多房产类网站比较优秀的功能,想把别人比较优秀的设计和想法集合到一起,那时的设计稿和功能实现,简直就是改了又改,今 ...

随机推荐

  1. hdu 3047 Zjnu Stadium(并查集)

    题意: 300个座位构成一个圈. 有N个人要入座. 共有M个说明 :A B X ,代表B坐在A顺时针方向第X个座位上.如果这个说明和之前的起冲突,则它是无效的. 问总共有多少个无效的. 思路: 并查集 ...

  2. Linux 权限控制

    权限管理概述 为什么要进行权限管理? 因为在生产服务器上,如果要让普通用户登录,就要给他分配合理的权限,在服务器上需要为用户严格定义权限等级,否则如果所有人都是roσt权限,权限过高容易导致岀现误操作 ...

  3. 论文翻译:Fullsubnet: A Full-Band And Sub-Band Fusion Model For Real-Time Single-Channel Speech Enhancement

    论文作者:Xiang Hao, Xiangdong Su, Radu Horaud, and Xiaofei Li 翻译作者:凌逆战 论文地址:Fullsubnet:实时单通道语音增强的全频带和子频带 ...

  4. 聊一聊声明式接口调用与Nacos的结合使用

    背景 对于公司内部的 API 接口,在引入注册中心之后,免不了会用上服务发现这个东西. 现在比较流行的接口调用方式应该是基于声明式接口的调用,它使得开发变得更加简化和快捷. .NET 在声明式接口调用 ...

  5. 【Docker】Asp.net core在docker容器中的端口问题

    还记得[One by one系列]一步步学习docker(三)--实战部署dotnetcore中遇到的问题么?容器内部启动始终是80端口,并不由命令左右. docker run --name cont ...

  6. Debug代码调试

    Debug代码调试 第一步在代码左侧先点一个红点 第二步右键选择Debug运行 第三步点击Step Into按键分步进行 练习题: s2 = 'python python python python ...

  7. 日记啦QWWQ

    随便写写 时间 :2021年11月15日 今天是在博客园创建博客的第一天,彻底放弃在CSDN中的博客,广告实在是太多了,QWQ. 来计科的第一个学期就快要结束了,期间有很多的遗憾,往后加油吧! 没什么 ...

  8. 保姆级别的vue + ElementUI 搭建后台管理系统教程

    vue + ElementUI 搭建后台管理系统记录 本文档记录了该系统从零配置的完整过程 项目源码请访问:https://gitee.com/szxio/vue2Admin,如果感觉对你有帮助,请点 ...

  9. Kubernetes 入门基础

    我们要学习 Kubernetes,就有首先了解 Kubernetes 的技术范围.基础理论知识库等,要学习 Kubernetes,肯定要有入门过程,在这个过程中,学习要从易到难,先从基础学习. 接下来 ...

  10. [luogu4259]寻找车位

    考虑一个分治的做法:按行分治,将所有区间分为两类--经过分割线的.在左/右区间内部,后者显然可以递归下取,考虑前者 先求出出该行上每一列向上和向下的最大长度,记作$up_{i}$和$down_{i}$ ...