FileReader读取文件

2023-11-01

前言:FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件。

input:file

在介绍FileReader之前,先简单介绍input的file类型。

<input type="file" id="inputBox">

input的file类型会渲染为一个按钮和一段文字。点击按钮可打开文件选择窗口,文字表示对文件的描述(大部分情况下为文件名);file类型的input会有files属性,保存着文件的相关信息。

image

点击按钮上传一个文件后,在控制台打印input.files,如下:

imageimage

可以发现input.files是一个数组,由传入的file对象组成。每个file对象包含以下属性:

lastModified:数值,表示最近一次修改时间的毫秒数;

lastModifiedDate:对象,表示最后一次表示最近一次修改时间的Date对象(高程中说是字符串,根据上图可看出应该为对象,为了层级清晰未对其展开,大家可自行查看,其可调用Date对象的有关方法,例如getDay方法);

name:本地文件系统中的文件名;

size:文件的字节大小;

type:字符串,文件的MIME类型;

weblitRelativePath:此处为空;当在input上加上webkitdirectory属性时,用户可选择文件夹,此时weblitRelativePath表示文件夹中文件的相对路径。比如:

<input type="file" id="inputBox" webkitdirectory>

点击按钮添加一个包含3个文件的名为php的文件夹后,控制台打印inputBox.files,如下:

imageimage

可看出,此时weblitRelativePath表示当前file对象的文件在文件夹中的路径。

FileReader

以上file对象只获取到了对文件的描述信息,但没有获得文件中的数据,而inputBox.value也只是保存的是文件的绝对路径(这里就不展示了,大家可以自己试一试)。我们可以通过html5提供的FileReader读取到文件中的数据。

首先创建一个FileReader实例:

var reader = new FileReader();

【方法】

FileReader提供了如下方法:

readAsArrayBuffer(file) 按字节读取文件内容,结果用ArrayBuffer对象表示
readAsBinaryString(file) 按字节读取文件内容,结果为文件的二进制串
readAsDataURL(file) 读取文件内容,结果用data:url的字符串形式表示
readAsText(file,encoding) 按字符读取文件内容,结果用字符串形式表示
abort() 终止文件读取操作

readAsDataURL和readAsText较为常用,这里只对这两者进行说明。

readAsDataURL会将文件内容进行base64编码后输出:

var inputBox = document.getElementById("inputBox");
inputBox.addEventListener("change",function(){
  var reader = new FileReader();
  reader.readAsDataURL(inputBox.files[0]);//发起异步请求
  reader.onload = function(){
    //读取完成后,数据保存在对象的result属性中
    console.log(this.result)
  }
})

控制台为当前所传文件的base64编码表示。由于媒体文件的src属性,可以通过采用网络地址或base64的方式显示,因此我们可以利用readAsDataURL实现对图片的预览。

<input type="file" id="inputBox" >
<img src="" id="img">
var inputBox = document.getElementById("inputBox");
var img = document.getElementById("img");
inputBox.addEventListener("change",function(){
  var reader = new FileReader();
  reader.readAsDataURL(inputBox.files[0]);//发起异步请求
  reader.onload = function(){
    //读取完成后,将结果赋值给img的src
    img.src = this.result } })

如上,只需将读取的结果赋给图片的src属性,即可预览图片:

image

readAsText(file,encoding)可按指定编码方式读取文件,但读取文件的单位是字符,故对于文本文件,只要按规定的编码方式读取即可;而对于媒体文件(图片、音频、视频),其内部组成并不是按字符排列,故采用readAsText读取,会产生乱码,因此不是最理想的读取文件的方式。

【事件】

onabort 当读取操作被中止时调用
onerror 当读取操作发生错误时调用
onload 当读取操作成功完成时调用
onloadend 当读取操作完成时调用,无论成功或失败
onloadstart 当读取操作开始时调用
onprogress 在读取数据过程中周期性调用
var inputBox = document.getElementById("inputBox");
var count=0;
inputBox.addEventListener("change",function(){
  var reader = new FileReader();
  reader.readAsText(inputBox.files[0],"utf-8");//发起异步请求
  reader.onload = function(){
    console.log("加载成功") } reader.onloadstart = function(){ console.log("开始加载") } reader.onloadend= function(){ console.log("加载结束") } reader.onprogress = function(){ count++; console.log("加载中"+count) } })

image

每过50ms左右,就会触发一次progress事件,对于较大的文件可以利用progress实现进度条;onload事件在onloadend之前触发。

由于种种原因无法读取文件时,会触发error事件。触发error事件时,相关信息保存在FileReader对象的error属性中,这个属性将保存一个对象,此对象只有一个属性code,即错误码。1表示未找到文件,2表示安全性错误,3表示读取中断,4表示文件不可读,5表示编码错误。

如果想中断读取过程,可以调用abort方法,就会触发abort事件。

无论触发load,error,abort事件中哪一个,最终都会触发loadend事件。

转载于:https://www.cnblogs.com/youhong/p/7221080.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FileReader读取文件 的相关文章

  • 闭包使用的3种情景

    定义 通俗讲 闭包是函数里面再定义一个函数 里层函数能访问到外层函数的局部变量 也就是说闭包是一个能访问外层函数局部变量的函数 常用情景有以下3种 1 在window下有个全局变量a 在函数checkScope内部有个局部变量a 需求 在w
  • Parkour World 游戏内测攻略详解

    Parkour World 是一款将赛博朋克风格与跑酷元素结合的运动类PC端游戏 玩家通过在虚拟世界中进行跑酷 从而获取相应的奖励 Parkour World结合区块链技术 采用保值NFT以及独特的3token Arb Hood Yuri
  • Spring源码分析(七)Bean生命周期源码解析5:Bean的销毁

    Bean的销毁过程 应用场景 通过实现DisposableBean接口 或者使用注解 PreDestroy都行 Component public class OrderService implements DisposableBean pu
  • 游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    本系列文章由zhmxy555编写 转载请注明出处 http blog csdn net zhmxy555 article details 7405479 作者 毛星云 邮箱 happylifemxy qq com 欢迎邮件交流编程心得 上一
  • 领域驱动设计:DDD 关键概念

    文章目录 领域和子域 核心域 通用域和支撑域 通用语言 限界上下文 实体 值对象 聚合 聚合根 设计聚合 DDD 的知识体系提出了很多的名词 像 领域 子域 核心域 通用域 支撑域 限界上下文 聚合 聚合根 实体 值对象等等 非常多 领域和
  • 归一化笔记

    目录 为什么要归一化 归一化的方法有哪些 归一化各方法特点 归一化的意义 哪些机器学习算法需要做归一化 哪些机器学习算法不需要做归一化 为什么要归一化 因为每一列数据的量纲不同 导致数据分布区间区间存在差异 举例 人的身高可以是180cm
  • 搜狐2012年校园招聘会笔试题解析

    一 不定项选择题 1 以下程序的打印结果是 cpp view plain copy include
  • QT笔记- 使窗口不获得焦点,但响应鼠标事件

    HWND wid HWND this gt winId SetWindowLong wid GWL EXSTYLE GetWindowLong wid GWL EXSTYLE WS EX NOACTIVATE WS EX COMPOSITE
  • Polycarp and Div 3【Codeforces Round #496 (Div. 3)【D题】】【贪心】

    应该说是今天凌晨的吧 第一次打Code Forces 懵懵懂懂的 不过感觉还是良好 做了几道签到题 难题还是没有那个水准去做 Polycarp likes numbers that are divisible by 3 He has a h
  • 应用统计学与R语言实现笔记(番外篇四)——bookdown使用与OR值计算

    本期是之前做的应用统计学与R语言实现笔记的番外篇四 本期主要关注两个问题 一个是重新利用R的bookdown包创建新的电子书 另一个是计算公共卫生当中一个比较常见的指标OR值 文章目录 1 bookdown使用 2 公式更正 3 OR值计算
  • linux下网站压力测试工具webbench

    webbench最多可以模拟3万个并发连接去测试网站的负载能力 个人感觉要比Apache自带的ab压力测试工具好 安装使用也特别方便 1 适用系统 Linux 2 编译安装 引用wget http blog s135 com soft li
  • Sentinel 入门使用

    目录 一 Sentinel简介 1 1Sentinel简介 1 2 Sentinel与Hystrix的区别 1 3 名词解释 二 sentinel控制台 2 1 下载启动控制台 2 3 客户端接入控制台 2 4 Rest整合Sentinel
  • python基本概念-关键要素

    1 要素1 数据类型 Python提供了几种内置的数据类型 现在我们只关注其中两种 Python使用int类型表示整数 正整数或负整数 使用str类型表示字符串 Unicode字符序列 如果需要将一个数据项从某种类型转换为另一种类型 可以使
  • DB2数据库连接(jdbc连接)encoding not supported

    在进行db2数据库连接过程中发现了一些问题 报如下错误 com ibm db2 jcc b DisconnectException encoding not supported 该问题的出现是IBM JDK和sun JDK之间相互不支持 解
  • 【滤波器】7. 带通滤波器

    将低通滤波器和高通滤波器串联 如下图所示 就可得到带通滤波器 设低通滤波器的截止频率为 f p 1 f p1 fp1 高通滤波器的截止频率为
  • Spark 的Shuffle过程详解

    一 Shuffle的作用是什么 Shuffle的中文解释为 洗牌操作 可以理解成将集群中所有节点上的数据进行重新整合分类的过程 其思想来源于hadoop的mapReduce Shuffle是连接map阶段和reduce阶段的桥梁 由于分布式
  • if与if else与if else if else之间的用法与区别(C++)

    1 if 满足这个条件 执行语句操作 不满足条件 不操作 结构 if 条件 语句 2 if else 满足这个条件 执行语句1操作 不满足 执行语句2操作 结构 if 条件 语句1 else 语句2 备注 通俗说就是两者取其一 注意 if
  • 简单方法恢复linux以及windows启动引导

    1 恢复linux启动引导 以ubuntu为例 很多小孩喜欢用wubi装linux 确实这种方法比较简单 比较安全 但是这种安装方法是基于windows的 也就是说 如果windows挂了 比如重装了或还原了 那么原来安装的linux也就没
  • cvFindContours函数使用

    CV IMPL intcvFindContours void img CvMemStorage storage CvSeq firstContour int cntHeaderSize int mode int method CvPoint
  • Servlet 实现重定向几种方法

    servlet重定向 在servlet JSP编程中 服务器端重定向可以通过下面两个方法来实现 1 运用javax servlet RequestDispatcher接口的forward方法 2 或者运用javax servlet http

随机推荐

  • 基于FPGA的串口通讯设计与实现

    繁體 基于FPGA的串口通讯设计与实现 日期 2012 03 26 来源 作者 字体 大 中 小 随着多微机系统的应用和微机网络的发展 通信功能越来起重要 串行通信是在一根传输线上一位一位传送信息 这根线既作数据线又作联络线 串行通信作为一
  • uniapp实现支付功能 和 可视化拖拽工具

    1 支付功能 https blog csdn net weixin 37787674 article details 103012041 2 分享一个 uniapp uview ui 可视化 完全自由拖拽 一键生成flex代码网站 http
  • 你必须知道的495个C语言问题整理三

    1 为什么大家都说不要使用gets 跟fgets 不同 gets 不能被告知输入缓冲区的大小 因此不能避免缓冲区的溢出 标准库的fgets 函数对gets 作了很大的改进 尽管它仍然不完善 2 fgetops fsetops 和ftell
  • python入门笔记——函数①

    python入门笔记 函数 def function 定义一个名为function的函数 定义函数时用下面来解释该函数的用处 这个函数是用来重复输出4次 你好 的 return for i in range 1 5 print 你好 pas
  • SSL、TLS、HTTPS的关系

    SSL TLS HTTPS的关系 SSL Secure Sockets Layer 安全套接字协议 TLS Transport Layer Security 传输层安全性协议 TLS是SSL的升级版 两者几乎是一样的 HTTPS Hyper
  • Java 多线程 -- 从入门到精通

    持续更新中 欢迎收藏 关注 以便查看后续 Java 多线程 从入门到精通 Java线程与线程的区别 多线程的实现方法 Thread中start和run方法的区别 Thread和Runnable的关系 使用Callable和Future创建线
  • 神经网络的三种可视化方法——使用keras和MXNet(gluon)实现

    神经网络的三种可视化方法 用keras和MXNet gluon 实现 目录 神经网络的三种可视化方法 用keras和MXNet gluon 实现 概述 keras实现 keras特征图可视化 keras可视化滤波器 卷积核 的最大响应图 k
  • 清除内存/缓存

    1 查看缓存 free h 2 清理缓存 sync echo 3 gt proc sys vm drop caches 我们在清理缓存前应该先sync下 因为系统在操作的过程当中 会把你的操作到的文件资料先保存到buffer中去 因为怕你在
  • 刷脸支付产业也迎来新的跃升时刻

    2019年刷脸支付异常火爆 一种创投人青睐有加 纷纷入局 一项新事物从诞生到发展总要经历很多波折 对于刷脸支付行业来说 更是如此 2020年初新冠疫情肆虐 人们被围在城里 圈在村里 各类实体门店到店率急剧下降 刷脸支付一度遇冷 而在疫情期间
  • C++星罗万象时钟罗盘

    编写思路 该程序的难点在于字符串的书写角度 理解了这个就已经理解了这个程序的核心内容 需要注意的地方是这个程序的每一圈代表一个 for 循环 我开始写的时候认为一个 for 循环嵌套一个 for 循环 但是后面我发现 for 循环嵌套的太多
  • vue-chat项目之重构与体验优化

    前言 vue chat 也就是我的几个月之前写的一个基于vue的实时聊天项目 到目前为止已经快满400star了 注册量也已经超过了1700 消息量达2000 由于一直在实习 没有时间对它频繁地更新 趁着这个国庆 对他进行了一次重构 希望我
  • 国内研发!适用于安卓应用程序的 Word文档功能开发组件来啦!

    你是否在寻找一款工具能够在Android应用程序中的Word文档管理的开发工具 那么 好消息来啦 Spire系列文档开发组件又添新成员 专门用于在 Android 手机应用程序中创建 读取 操作和转换 Word 文档 Spire Doc f
  • Flutter移动应用开发 - 商品界面

    目录 0 项目简介 1 效果展示 2 代码 commodity dart CardTry dart recentPurchase dart 0 项目简介 项目想法脱胎于2023年服务外包大赛A18题 随手买 详情 整个APP思路如下 这篇博
  • QDockWidget设置初始大小的一个解决方案

    QDockWidget仅仅作为其子控件的一个包装 因此对其使用resize 或者setGeometry 均不管用 这造成QDockWidget的初始大小常常不尽如人意 网上有前辈提出通过调用QDockWidget的setMaximumSiz
  • ElementUI浅尝辄止34:Radio 单选框

    在一组备选项中进行单选 1 如何使用 由于选项默认可见 不宜过多 若选项过多 建议使用 Select 选择器 要使用 Radio 组件 只需要设置v model绑定变量 选中意味着变量的值为相应 Radio label属性的值 label可
  • 工业设备自动化平台的一些杂想

    今天是愚人节 浦西开始正式封闭 所有人都被关在家里足不出户 等待着不知道何时开始的核酸检测 一时间也不知道能做些啥 闲的发慌 总得找点事情做做 翻了会CLR的书 又背了会单词 总感觉心不静 回想起之前被人问过的工业设备自动化平台的问题 突然
  • 非递归实现二叉树遍历(附c++完整代码)

    先序 中序和后序遍历过程 遍历过程中经过结点的路线一样 只是访问各结点的时机不同 从图中可以看到 前序遍历在第一次遇见元素时输出 中序遍历在第二次遇见元素时输出 后序遍历在第三次遇见元素时输出 非递归算法实现的基本思路 使用堆栈 一 前序遍
  • 【Android Studio】android.database.sqlite.SQLiteException: no such table: XXX (code 1 SQLITE_ERROR)

    问题描述 android database sqlite SQLiteException no such table XXX code 1 SQLITE ERROR while compling select from xxxx 参考了各种
  • 字符替换C++

    题目描述 把一个字符串中特定的字符全部用给定的字符替换 得到一个新的字符串 输入 只有一行 由一个字符串和两个字符组成 中间用单个空格隔开 字符串是待替换的字符串 字符串长度小于等于1000个字符 且不含空格等空白符 接下来一个字符为需要被
  • FileReader读取文件

    前言 FileReader是一种异步文件读取机制 结合input file可以很方便的读取本地文件 input file 在介绍FileReader之前 先简单介绍input的file类型