前端学习笔记之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.mzph.cn/pingmian/62548.shtml

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

相关文章

第三方Express 路由和路由中间件

文章目录 1、Express 应用使用回调函数的参数&#xff1a; request 和 response 对象来处理请求和响应的数据。2、Express路由1.路由方法2.路由路径3.路由处理程序 3. 模块化路由4. Express中间件1.中间件简介2.中间件分类3.自定义中间件 1、Express 应用使用回调函数的参数&am…

给UE5优化一丢丢编辑器性能

背后的原理 先看FActorIterator的定义 /*** Actor iterator* Note that when Playing In Editor, this will find actors only in CurrentWorld*/ class FActorIterator : public TActorIteratorBase<FActorIterator> {//..... }找到基类TActorIteratorBase /*** Temp…

小程序跳转到本页面并传参

const pages getCurrentPages(); const currentPage pages[pages.length - 1]; // 当前页面路由 const route currentPage.route; // 当前页面参数 const options currentPage.options;// 构建新的 URL 参数 const newOptions {...options,// newParam: newValue }; // 你…

【机器学习】支持向量机SVR、SVC分析简明教程

关于使用SVM进行回归分析的介绍很少&#xff0c;在这里&#xff0c;我们讨论一下SVR的理论知识&#xff0c;并对该方法有一个简明的理解。 1. SVC简单介绍 SVR全称是support vector regression&#xff0c;是SVM&#xff08;支持向量机support vector machine&#xff09;对回…

pytest+allure生成报告显示loading和404

pytestallure执行测试脚本后&#xff0c;通常会在电脑的磁盘上建立一个临时文件夹&#xff0c;里面存放allure测试报告&#xff0c;但是这个测试报告index.html文件单独去打开&#xff0c;却显示loading和404, 这个时候就要用一些办法来解决这个报告显示的问题了。 用命令产生…

分布式事务调研

目录 需求背景&#xff1a; 本地事务 分布式基本理论 1、CAP 定理 2、BASE理论 分布式事务方案 #2PC #1. 运行过程 #1.1 准备阶段 #1.2 提交阶段 #2. 存在的问题 #2.1 同步阻塞 #2.2 单点问题 #2.3 数据不一致 #2.4 太过保守 3PC #本地消息表 TCC TCC原理 …

鱼眼相机模型-MEI

参考文献&#xff1a; Single View Point Omnidirectional Camera Calibration from Planar Grids 1. 相机模型如下&#xff1a; // 相机坐标系下的点投影到畸变图像// 输入&#xff1a;相机坐标系点坐标cam 输出&#xff1a; 畸变图像素点坐标disPtvoid FisheyeCamAdapter::…

[GKCTF 2021]签到

[GKCTF 2021]签到 wireshark跟踪http流&#xff0c;基本编解码&#xff0c;倒叙&#xff0c;栅栏密码 找到cat /f14g 把包里返回的字符串先hex解码&#xff0c;再base64解码&#xff0c;看到一个时间是倒叙&#xff0c;不含flag 继续往下面翻&#xff0c;可以看到cat%2Ff14g%7…

【Linux】【字符设备驱动】深入解析

Linux字符设备驱动程序用于控制不支持随机访问的硬件设备&#xff0c;如串行端口、打印机、调制解调器等。这类设备通常以字符流的形式与用户空间程序进行交互。本节将深入探讨字符设备驱动的设计原理、实现细节及其与内核其他组件的交互。 1. 引言 字符设备驱动程序是Linux内…

【论文笔记】Tool Learning with Foundation Models 论文笔记

Tool Learning with Foundation Models 论文笔记 文章目录 Tool Learning with Foundation Models 论文笔记摘要背景&#xff1a;工作&#xff1a; 引言工具学习的发展本文工作&#xff08;大纲&目录&#xff09; 背景2.1 工具使用的认知起源2.2 工具分类&#xff1a;用户界…

电阻可靠性的内容

一、影响电阻可靠性的因素&#xff1a; 影响电阻可靠性的因素有温度系数、额定功率&#xff0c;最大工作电压、固有噪声和电压系数 &#xff08;一&#xff09;温度系数 电阻的温度系数表示当温度改变1摄氏度时&#xff0c;电阻阻值的相对变化&#xff0c;单位为ppm/℃.电阻温…

Redis等Spring Cache 框架 实现基于注解的缓存功能

Spring Cache 框架 实现基于注解的缓存功能 底层 基于代理技术 一旦进入方法就进入代理对象 如果redis里有就直接返回 不会走方法 如果缓存没有数据 则通过反射走方法。 概念 缓存 相当于之前的事务处理 同步更改 只是提供了一层抽象 底层可以切换不同的缓存实现 EHCach…

【Zookeeper】三,Zookeeper的安装与基本操作

文章目录 安装Zookeeper下载解压解压后的目录结构运行Zookeeper 基本操作 安装Zookeeper 下载 官网下载Zookeeper&#xff0c;会得到一个tar包&#xff0c;如&#xff1a;apache-zookeeper-3.8.4-bin.tar.gz 解压 tar -xvf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/loca…

【Python TensorFlow】进阶指南(续篇四)

在前面的文章中&#xff0c;我们探讨了TensorFlow在实际应用中的多种高级技术和实践。本文将继续深入讨论一些更为专业的主题&#xff0c;包括模型压缩与量化、迁移学习、模型的动态调整与自适应训练策略、增强学习与深度强化学习&#xff0c;以及如何利用最新的硬件加速器&…

HASH256开源代码计算错误问题

计算量超500KB报错 OTA升级中可能会涉及到CRC、hash校验等算法&#xff0c;小编从网上抄到了HASH256的源码&#xff0c;拿来使用的时候却发现了一个问题&#xff0c;当源文件约大于500KB的时候会发现其计算出的hash值出现错误。 经过实际测试得知&#xff0c;当源文件大于约50…

【人工智能】Python常用库-TensorFlow常用方法教程

TensorFlow 是一个广泛应用的开源深度学习框架&#xff0c;支持多种机器学习任务&#xff0c;如深度学习、神经网络、强化学习等。以下是 TensorFlow 的详细教程&#xff0c;涵盖基础使用方法和示例代码。 1. 安装与导入 安装 TensorFlow&#xff1a; pip install tensorflow…

Spring Boot教程之十一:获取Request 请求 和 Put请求

如何在 Spring Boot 中获取Request Body&#xff1f; Java 语言是所有编程语言中最流行的语言之一。使用 Java 编程语言有几个优点&#xff0c;无论是出于安全目的还是构建大型分发项目。使用 Java 的优点之一是 Java 试图借助类、继承、多态等概念将语言中的每个概念与现实世…

uniapp实现组件竖版菜单

社区图片页面 scroll-view scroll-view | uni-app官网 (dcloud.net.cn) 可滚动视图区域。用于区域滚动。 需注意在webview渲染的页面中&#xff0c;区域滚动的性能不及页面滚动。 <template><view class"pics"><scroll-view class"left"…

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前&#xff0c;需要搭建Node环境以及Vue-CLI脚手架&#xff0c;由于本篇文章为上一篇文章的补充&#xff0c;也是为了给大家分享更为完整的搭建vue项目方式&#xff0c;所以环境准备部分采用Vue教程&#xff5c;搭建vue项目&#xff5c;V…

前海湾地铁的腾通数码大厦背后的临时免费停车点探寻

临时免费停车点&#xff1a;前海湾地铁的腾通数码大厦背后的桂湾大街&#xff0c;目前看不仅整条桂湾大街停了​车&#xff0c;而且还有工地餐点。可能是这个区域还是半工地状态&#xff0c;故暂时还不会有​罚单的情况出现。 中建三局腾讯数码大厦项目部A栋 广东省深圳市南山…