前端学习笔记之FileReader

概念

FileReader接口允许网页应用程序异步读取用户计算机上存储的文件(或原始数据缓冲区)的内容,使用File或Blob对象来制定要读取的文件或数据。

File对象可以通过用户使用<input>元素选择文件后返回的FileList对象获得,或者来自拖放操作的DataTransfer对象。

FileReader只能访问用户明确选择的文件内容,这些文件要么是通过HTML<input type="file">元素选择的,要么是通过拖放操作选择的,它不能用来通过路径名从用户的文件系统中读取文件。

实例属性:

FileReader.error:表示在读取文件过程中发生的错误的DOMException。所谓DOMException ,就是DOMException 接口表示一种异常事件(称为异常),当调用一个方法或访问一个 Web API 的属性时会发生这种事件。这是在 Web API 中描述错误条件的方式。【简答来说就是抛出的异常,会出现各种错误名称:如:NotFoundError The object cannot be found here. 】

FileReader.readyState:表示FileReader状态的数字。

一共有三种:

名称描述
EMPTY      0尚未加载任何数据

LOADING

DONE

1

2

数据正在加载中

整个请求已完成

FileReader.result:文件的内容,这个属性仅仅在读取操作完成后生效,并且数据的格式取决于用于启动读取操作的方法。

实例方法

FileReader.abort():中断读取操作,返回式readyState将为DONE。

FileReader.readAsArrayBuffer():开始读取指定Blob的内容,一旦完成,result属性将包含一个表示文件数据的ArrayBuffer。

FileReader.readAsDataURL():开始读取指定Blob内容,一旦完成,result属性将包含一个表示文件的数据URL。

FileReader.readAsText():开始读取指定Blob内容,一旦完成,result属性将包含文件的内容作为文本字符串,可以指定一个可选的编码名称。

事件

使用addEventListener()或分配一个事件监听器到这个接口的oneventname属性来监听这些事件。一旦不再使用FileReader,使用removeEventListener()移除事件监听器,以避免内存泄漏。

abort:当读取操作被终止时触发。

error:当读取由于错误而失败时触发。

load:当读取成功完成时触发。

loadend:无论读取成功与否,当去读完成时触发。

loadstart:当读取开始时触发。

progress:在读取数据时定时触发。

下面以一个实例来使用上面的部分实例和方法:
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>File Download Example</title>
</head>
<body><input type="file" id="fileInput" accept="image/*,video/*,audio/*,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/pdf">
<button id="downloadBtn" disabled>Download</button>
<script>
document.getElementById('fileInput').addEventListener('change', function(event) {var file = event.target.files[0];if (file) {document.getElementById('downloadBtn').disabled = false;// 使用readAsDataURL读取文件var reader = new FileReader();reader.onload = function(e) {// 读取完成后,直接使用DataURL作为下载链接var dataUrl = e.target.result;var blob = new Blob([e.target.result], { type: file.type });// 创建Blob的URLvar url = URL.createObjectURL(blob);// 定义下载功能document.getElementById('downloadBtn').onclick = function() {// 创建一个临时<a>元素用于下载var link = document.createElement('a');// link.href = dataUrl;link.href = url;link.download = file.name;// 通过模拟点击链接来触发下载document.body.appendChild(link);link.click();// 清理临时链接document.body.removeChild(link);};};// 读取文件为DataURL// reader.readAsDataURL(file);// 读取文件为Blob对象reader.readAsArrayBuffer(file);// reader.(file);} else {document.getElementById('downloadBtn').disabled = true;}
});
</script></body>
</html>

执行结果为:

其实,该实例就是在本地上传文件后,然后点击下载按钮,该文件就会在浏览器中进行下载。

 

在做这个实例的时候也出现了一个问题,其实就是对于Blob和File的理解不清楚,因为我们需要上传的文件使用了FileReaderreadAsText方法来读取文件内容。这意味着下载的文件将包含文本数据。如果你想要保持文件的原始二进制格式,你可以改用readAsArrayBufferreadAsDataURL方法,并相应地调整Blob的构造方式。所以我们在读取的时候,如果要使用的是Blob, 那么读取的时候就要使用readAsArrayBuffer.

如果使用的是File,就是直接input type=File,而不是被Blob包裹的,就直接使用readAsDataURL即可。如果混用了,那么就会出现下面的情况:【也就是虽然文件能够下载,但是你预览不了的情况】

 

 详细的解释如下:

当我们使用 readAsDataURL 方法时,e.target.result 是一个包含文件数据的 Base64 编码的字符串(DataURL),它已经包含了文件类型(MIME 类型)和编码后的数据。因此,当我们直接将这个字符串作为链接的 href 属性时,浏览器能够正确地解析并下载文件。

然而,当我们尝试将这个 DataURL 字符串封装进一个 Blob 对象,并创建一个新的 URL 时,你实际上是在将一个已经是 Base64 编码的字符串再次当作原始二进制数据来处理。这导致最终的文件内容不正确,因此文件无法打开。

为了解决这个问题,应该使用 readAsArrayBuffer 而不是 readAsDataURL,因为 ArrayBuffer 包含的是原始的二进制数据,这些数据可以直接用于创建 Blob 对象。

Blob

Blob(Binary Large Object)对象代表了一种可以存储大量二进制数据的不可变对象。在 Web 开发中,Blob 对象通常用于处理来自文件系统或网络请求的二进制数据。Blob 对象是不可变的,这意味着一旦创建,其内容就不能被修改,但可以读取。

以下是 Blob 对象的一些关键特性和用法:

特性

  1. 不可变性:Blob 对象一旦被创建,其内容就不能更改。如果需要修改内容,必须创建一个新的 Blob 对象。

  2. 类型:Blob 对象有一个 type 属性,它是一个 MIME 类型的字符串,表示数据的类型。如果类型未知,这个属性是空字符串。

  3. 大小:Blob 对象有一个 size 属性,表示存储在 Blob 中的数据的字节大小。

  4. 分割:Blob 对象可以使用 slice() 方法进行分割,返回一个新的 Blob 对象,包含原始 Blob 对象的一部分数据。

创建 Blob 对象

Blob 对象可以通过多种方式创建,例如:

  • 使用 Blob 构造函数,传入一个包含数据的数组和一个可选的 MIME 类型字符串。
  • 通过 <input type="file"> 元素的 files 属性获取用户选择的文件。
  • 通过拖放 API 获取用户拖入的数据。

示例:

// 创建一个包含文本的 Blob 对象

var blob = new Blob(["Hello, world!"], { type: "text/plain;charset=utf-8" });

// 创建一个包含 HTML 的 Blob 对象

var blob = new Blob(["<h1>Hello, world!</h1>"], { type: "text/html;charset=utf-8" });

读取 Blob 对象

Blob 对象的数据可以通过 FileReader API 读取,或者可以使用 URL.createObjectURL() 方法创建一个指向 Blob 对象的 URL,然后将其用于 <img><video> 或 <audio> 元素。

示例:

// 使用 FileReader 读取 Blob 对象的内容

var reader = new FileReader();

reader.onload = function(event) {

var text = event.target.result;

console.log(text);

};

reader.readAsText(blob); // 创建一个指向 Blob 对象的 URL

var url = URL.createObjectURL(blob); // 使用这个 URL 作为图片的源

var img = document.createElement('img');

img.src = url;

document.body.appendChild(img);

使用 Blob 对象

Blob 对象常用于以下场景:

  • 文件上传:将 Blob 对象发送到服务器。
  • 文件下载:创建一个 Blob 对象,然后触发一个下载。
  • 数据处理:读取和操作文件内容,例如将图像转换为 Base64 编码。

Blob 对象是处理 Web 应用程序中二进制数据的核心工具,它允许开发者以灵活的方式处理文件和多媒体内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/482455.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity类银河战士恶魔城学习总结(P149 Screen Fade淡入淡出菜单)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了进入游戏和死亡之后的淡入淡出动画效果 UI_FadeScreen.cs 1. Animator 组件的引用 (anim) 该脚本通过 Animator 控制 UI 元…

win10系统部署RAGFLOW+Ollama教程

本篇主要基于linux服务器部署ragflowollama&#xff0c;其他操作系统稍有差异但是大体一样。 一、先决条件 CPU ≥ 4核&#xff1b; RAM ≥ 16 GB&#xff1b; 磁盘 ≥ 50 GB&#xff1b; Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1。 如果尚未在本地计算机&#xff…

Day2 生信新手笔记: Linux基础

一、基础知识 1.1 服务器 super computer 或 server 1.2 组学数据分析 组学数据&#xff1a;如基因组学、转录组学、蛋白质组学等&#xff1b; 上游分析&#xff1a;主要涉及原始数据的获取和初步处理&#xff0c;计算量大&#xff0c;消耗的资源较多&#xff0c;在服务器完…

【热门主题】000072 分布式数据库:开启数据管理新纪元

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

【Linux】gdb / cgdb 调试 + 进度条

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、Linux调试器-gdb &#x1f31f;开始使用 &#x1f320;小贴士&#xff1a; &#x1f31f;gdb指令 &#x1f320;小贴士&#xff1a; ✨watch 监视 ✨打条件断点 二、小程序----进…

项目代码第1讲:各个文件夹是什么意思?按照官方文档教程创建项目,各个文件夹的理解、框架自主生成的Controller(Restful风格)

一、各个文件夹是什么意思&#xff1f; CacheHelper&#xff1a;给InMemory存储器 InMemory存储器【官方文档自带的】&#xff0c;副存储器SlaveController也没有用上 mappingProfile&#xff1a;原本想映射&#xff0c;也没用上 SelfStarting.cs&#xff1a;在桌面生成这个…

机器学习算法(六)---逻辑回归

常见的十大机器学习算法&#xff1a; 机器学习算法&#xff08;一&#xff09;—决策树 机器学习算法&#xff08;二&#xff09;—支持向量机SVM 机器学习算法&#xff08;三&#xff09;—K近邻 机器学习算法&#xff08;四&#xff09;—集成算法 机器学习算法&#xff08;五…

docker安装hadoop环境

一、使用docker搭建基础镜像 1、拉取centos系统镜像 # 我这里使用centos7为例子 docker pull centos:7 2、创建一个dockerfiler文件&#xff0c;用来构建自定义一个有ssh功能的centos镜像 # 基础镜像 FROM centos:7 # 作者 #MAINTAINER hadoop ADD Centos-7.repo /etc/yum.re…

vue 2 父组件根据注册事件,控制相关按钮显隐

目标效果 我不注册事件&#xff0c;那么就不显示相关的按钮 注册了事件&#xff0c;才会显示相关内容 实现思路 组件在 mounted 的时候可以拿到父组件注册监听的方法 拿到这个就可以做事情了 mounted() {console.log(this.$listeners, this.$listeners);this.show.search !…

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明&#xff1a; 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…

王道考研编程题总结

我还在完善中&#xff0c;边复习边完善&#xff08;这个只是根据我自身总结的&#xff09; 一、 线性表 1. 结构体 #define MaxSize 40 typedef struct{ElemType data[MaxSize]&#xff1b;int length; }SqList 2. 编程题 1. 删除最小值 题意 &#xff1a;从顺序表中删除…

PHM技术:一维信号时序全特征分析(统计域/频域/时域)| 信号处理

目录 0 引言 1 基于统计域的时序特征分析 2 基于谱域的时序特征分析 3 基于时域的时序特征分析 4 代码分析 5 小结 0 引言 我们将探索时序特征分析&#xff0c;这是信号处理中的关键技术之一。信号在我们的日常生活中无处不在&#xff0c;从声音到图像&#xff0c;从传感…

无人机数据处理系统:原理与核心系统

一、数据处理系统的运行原理 数据获取&#xff1a;无人机在飞行过程中&#xff0c;通过搭载的传感器&#xff08;如相机、激光雷达等&#xff09;采集到各种类型的数据&#xff0c;例如图像、点云等。这些数据是后续处理和分析的基础。 数据传输&#xff1a;采集到的数据会通…

close and shutdown?

背景&#xff1a;我们要讲述的是网络编程中常用的两个API&#xff1a; #include <unistd.h> int close(int fd); #include <sys/socket.h> int shutdown(int sockfd, int how); 以及TCP的半连接&#xff0c;半打开。 shutdown函数的行为依赖第二个参数区分&#xf…

Java设计模式——职责链模式:解锁高效灵活的请求处理之道

嘿&#xff0c;各位 Java 编程大神和爱好者们&#xff01;今天咱们要一同深入探索一种超厉害的设计模式——职责链模式。它就像一条神奇的“处理链”&#xff0c;能让请求在多个对象之间有条不紊地传递&#xff0c;直到找到最合适的“处理者”。准备好跟我一起揭开它神秘的面纱…

Javascript中DOM事件监听 (鼠标事件,键盘事件,表单事件)

#DOM&#xff08;Document Object Model&#xff09;事件监听是一种机制&#xff0c;它允许 JavaScript 代码在 HTML 文档中的元素上监听特定的事件。当这些事件发生时&#xff0c;与之关联的 JavaScript 函数&#xff08;也称为事件处理函数&#xff09;就会被执行。这使得网页…

TiDB 无统计信息时执行计划如何生成

作者&#xff1a; weiyinghua 原文来源&#xff1a; https://tidb.net/blog/4c49ac0d 一、Pseudo 统计信息总体生成规则 TiDB 在表无统计信息时&#xff0c;不会进行动态采样&#xff0c;而是用静态的、预设规则以及经验假设来生成计划。用函数 PseudoTable 创建一个伪统…

服务器密码错误被锁定怎么解决?

当服务器密码错误多次导致账号被锁定时&#xff0c;解决方法需要根据服务器的操作系统&#xff08;如 Linux 或 Windows &#xff09;和具体服务器环境来处理。以下是常见的解决办法&#xff1a; 一、Linux 服务器被锁定的解决方法 1. 使用其他用户账号登录 如果有其他未被…

认识redis 及 Ubuntu安装redis

文章目录 一. redis概念二. redis应用场景二. redis的特性四. 使用Ubuntu安装redis 一. redis概念 redis 是在内存中存储数据的中间件, 用在分布式系统 redis是客户端服务器结构的程序, 客户端服务器之间通过网络来通信 二. redis应用场景 redis可用作数据库 类似MySQL, 但…

LabVIEW内燃机气道试验台测控系统

基于LabVIEW软件开发的内燃机气道试验台测控系统主要应用于内燃机气道的性能测试和数据分析&#xff0c;通过高精度的测控技术&#xff0c;有效提升内燃机的测试精度和数据处理能力。 项目背景 随着内燃机技术的发展&#xff0c;对其气道性能的精准测量需求日益增加。该系统通…