前端学习笔记之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的URL
            var 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 应用程序中二进制数据的核心工具,它允许开发者以灵活的方式处理文件和多媒体内容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过shell脚本分析部署nginx网络服务

要求 1.接收用户部署的服务名称 2.判断服务是否安装 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&#xff1b;重启服务 没有安装&#xff1b;安装对应的软件包 3.测试 判断服务是否成功运行&#xff1b; 已运行&#xff0c;访问网站…

Java基础——(三)对象和类

1. 面向对象程序设计概述 1.1 OOP OOP&#xff1a;Object Oriented Programming&#xff0c;面向对象编程&#xff1b;OOD&#xff1a;Object Oriented Design&#xff0c;面向对象设计&#xff1b;OOA&#xff1a;Object Oriented Analyse&#xff0c;面向对象分析。 面向对…

vue2日历组件

【效果图】 <template><div style"width: 100%"><!-- <div> --><!-- <div>{{ startDate.getMonth() 1 - startDate.getDate() }}</div><div>{{ endDate.getMonth() 1 - endDate.getDate() }}</div> --&g…

Redis中的分布式锁(步步为营)

分布式锁 概述 分布式锁指的是&#xff0c;所有服务中的所有线程都去获取同一把锁&#xff0c;但只有一个线程可以成功的获得锁&#xff0c;其他没有获得锁的线程必须全部等待&#xff0c;直到持有锁的线程释放锁。 分布式锁是可以跨越多个实例&#xff0c;多个进程的锁 分布…

mmsegmentation自己的数据集

我最大的问题就是没安装官方给定的mask转换格式来转换 这种带白色的不行哦&#xff01; 黑色的可以&#xff0c;其实mask*50就可以看清楚标记的轮廓之类的。 数据集格式转换按照A,B,C代码直接转换&#xff1a;https://github.com/TommyZihao/Label2Everything/tree/main/lab…

yolov8的深度学习环境安装(cuda12.4、ubuntu22.04)

目录 一、先安装基础环境包 1.首先给Ubuntu安装Chrome浏览器&#xff08;搜索引擎换成百度即可&#xff09; 2、ubuntu 22.04中文输入法安装 3、安装 terminator 4、安装WPS for Linux 5、安装其它之前需要先安装anaconda 6、安装配置anaconda 7、安装完成anaconda后创建…

洛谷 B3626 跳跃机器人 C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/B3626 题目描述 地上有一排格子&#xff0c;共 n 个位置。机器猫站在第一个格子上&#xff0c;需要取第 n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这…

小型文件系统如何选择?FatFs和LittleFs优缺点比较

1 概述 文件系统在嵌入式系统中的作用不可或缺&#xff0c;它提供了对非易失性存储设备&#xff08;如闪存、SD卡等&#xff09;上的数据进行有效组织和管理的能力。通过文件系统&#xff0c;嵌入式系统可以像在传统计算机上一样创建、读取、写入和删除文件&#xff0c;实现了…

【JAVA] 杂谈: java中的拷贝(克隆方法)

这篇文章我们来介绍什么是拷贝&#xff0c;并且实现浅拷贝到深拷贝。 目录 一、浅拷贝 1.1 clone 方法 1.2 实现浅拷贝&#xff1a; 1.2.1 重写 clone方法 1.2.2 实现接口 Cloneable 1.2.3 调用克隆方法 1.2.4 原理图&#xff1a;​ 1.3 浅拷贝的不足 1.3.1 增加引用…

JS听到了双生花的回响

日期对象 学会了日期对象可以让网页显示日期 是用来表示时间的对象&#xff0c;可以得到当前系统的时间 实例化 new关键字&#xff0c;就是实例化的代表 就比如说&#xff0c;你没有对象&#xff0c;但是你是程序员&#xff0c;这个时候你可以先定义一个类&#xff08;你的…

BUUCTF—Reverse—Java逆向解密(10)

程序员小张不小心弄丢了加密文件用的秘钥&#xff0c;已知还好小张曾经编写了一个秘钥验证算法&#xff0c;聪明的你能帮小张找到秘钥吗&#xff1f; 注意&#xff1a;得到的 flag 请包上 flag{} 提交 需要用专门的Java反编译软件:jd-gui 下载文件&#xff0c;发现是个class文…

mac上的建议xftp 工具

mac上的建议xftp 工具 最近使用mac比较频繁了&#xff0c;但是第一次重度使用mac里面有很多的工具都是新的&#xff0c;有的window版本的工具无法使用。 xftp 的平替 Cyberduck 从它的官网上下载是免费的&#xff0c;但是如果使用 Apple store 要花费198呢。这不就剩下一大笔…

【文献阅读】自动化构音障碍严重程度分类:声学特征与深度学习技术的研究

自动化构音障碍严重程度分类:声学特征与深度学习技术的研究 文章目录 自动化构音障碍严重程度分类:声学特征与深度学习技术的研究思维导图摘要I. 引言A. 动机与相关工作II. 数据库III. 实验设计A. 分析 MFCC 和 CQCCB. 分析语言障碍特定特征C. 分析 i-向量IV. 特征设计V. 分类…

基于HTML和CSS的校园网页设计与实现

摘要 随着计算机、互联网与通信技术的进步&#xff0c;Internet在人们的学习、工作和生活中的地位也变得越来越高&#xff0c;校园网站已经成为学校与学生&#xff0c;学生与学生之间交流沟通的重要平台&#xff0c;对同学了解学校内发生的各种事情起到了重要的作用。学校网站…

操作系统 | 学习笔记 | 王道 | 2.2处理机调度

2.2 处理机调度 文章目录 2.2 处理机调度2.2.1 调度的概念2.2.2 调度的目标2.2.3 调度的实现2.2.4 典型的调度算法错题总结&#xff1a; 2.2.1 调度的概念 调度的基本概念 处理机调度是对处理机进行分配&#xff0c;即从就绪队列中按照一定的算法&#xff08;公平、高效的原则&…

论文概览 |《Urban Analytics and City Science》2023.05 Vol.50 Issue.4

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年5月第50卷第4期的论文的题目和摘要&#xff0c;一共包括19篇SCI论文&#xff01; 论文1 Data analytics and sustainable urban development in global cities 全球城市的数据…

【C++】优先队列(Priority Queue)全知道

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 一、前言 二、优先队列&#xff08;Priority Queue&#xff09…

服务熔断-熔断器设计

文章目录 服务为什么需要熔断熔断器设计思想熔断器代码实现 服务为什么需要熔断 对于服务端采用的保护机制为服务限流。 对于服务调用端是否存在保护机制&#xff1f; 假如要发布一个服务 B&#xff0c;而服务 B 又依赖服务 C&#xff0c;当一个服务 A 来调用服务 B 时&#x…

新能源汽车智慧充电桩管理方案:应用选型与充电协议应该怎么做?

新能源智慧充电桩平台采用虚拟化技术&#xff0c;使多种应用共享服务器、存储等硬件资源&#xff0c;可以帮助用户提供IT基础设施资源的利用效率&#xff0c;提升基础设施的应用和管理水平&#xff0c;实现计算资源的动态优化&#xff0c;使平台应用易维护、易扩充。 1、行业背…

SickOs: 1.1靶场学习小记

学习环境 kali攻击机&#xff1a;Get Kali | Kali Linux vulnhub靶场&#xff1a;https://download.vulnhub.com/sickos/sick0s1.1.7z 靶场描述&#xff1a; 这次夺旗赛清晰地模拟了在安全环境下如何对网络实施黑客策略从而入侵网络的过程。这个虚拟机与我在进攻性安全认证专…