Blob 和 File 的区别,以及 Blob、File、Base64 三种类型的相互转换

一、 Blob 和 File 的区别

BlobFile 都是 JavaScript 中用于处理二进制数据的对象,但它们有一些区别。

  • Blob

    • 定义: Blob 表示不可变的、原始数据的类文件对象。它通常用于存储大块的二进制数据,比如图像、音频或视频文件等。

    • 特点: Blob 对象可以包含任意类型的数据,不仅限于文本或二进制数据。它的数据是只读的,你不能直接修改 Blob 中的数据。

    • 创建方式: 可以通过构造函数 BlobBlobBuilder 来创建 Blob 对象。

    // 使用构造函数创建 Blob
    var blob = new Blob(["Hello, World!"], { type: "text/plain" });
    
  • File

    • 定义: FileBlob 的子类,通常用于表示用户选择的文件。它包含了文件的元信息,如文件名、大小、修改时间等。

    • 特点: 除了继承 Blob 的特性外,File 还包含文件的相关信息,例如文件名 (name)、文件的最后修改时间 (lastModifiedDate)、文件的 MIME 类型 (type) 等。

    • 创建方式: 通常通过用户交互选择文件,然后通过 File 构造函数创建。

    // 通过用户选择创建 File 对象
    <input type="file" id="fileInput" />
    var fileInput = document.getElementById('fileInput');
    var file = fileInput.files[0];
    
  • 总结:

    • Blob 是用于存储任意类型的二进制数据的对象,而 FileBlob 的一种特殊情况,用于表示用户选择的文件,并包含了文件的相关信息。

    • Blob 通常用于一般的二进制数据存储,而 File 更适合表示文件对象。

    • FileBlob 的扩展,因此 File 具有 Blob 的所有功能,并在此基础上添加了文件相关的元信息。

二、 Blob、File、Base64 三种类型的相互转换

  • File 转 Blob
const blob = new Blob([file], { type: file.type });
  • File/Blob 转 Base64
// 创建一个新的 FileReader 对象
const reader = new FileReader();
// 读取 File 对象
reader.readAsDataURL(file/blob);
// 加载完成后
reader.onload = () => {// 将读取的数据转换为 base64 编码的字符串const base64String = reader.result.split(',')[1];
}
  • Base64 转 Blob
const base64ToBlob = base64 => {let arr = base64.split(','),  // 使用逗号 , 将传入的 base64 字符串分割成一个数组。因为 base64 编码的字符串通常以 data:image/jpeg;base64, 这样的格式开头,所以这一步是为了去掉开头的部分。mime = arr[0].match(/:(.\*?);/)[1],  // 使用正则表达式从分割后的数组的第一个元素中提取 MIME 类型。例如,对于 data:image/jpeg;base64,,它将提取 image/jpegbstr = window.atob(arr[1]), // 使用 atob 方法将 base64 编码的字符串(去掉开头的部分后)解码为普通的字符串。n = bstr.length,  // 获取解码后的字符串的长度。u8arr = new Uint8Array(n);  // 创建一个新的 Uint8Array 对象,长度为解码后的字符串的长度。Uint8Array 是一个用于处理无符号 8 位整数的数组类型。while (n--) {  // 循环从最后一个字符开始,向前遍历解码后的字符串。u8arr[n] = bstr.charCodeAt(n);  // 将解码后的字符串的每个字符转换为对应的 ASCII 码值,然后存储到 u8arr 数组中。}return new Blob([u8arr], {   // 创建一个新的 Blob 对象,其中包含之前转换的二进制数据。type: mime, // 设置 Blob 对象的 MIME 类型为之前提取的类型。});
};
  • Base64 转 File
const base64ToFile = (base64, fileName) => {let arr = base64.split(',');let mime = arr[0].match(/:(.\*?);/)[1];let bstr = atob(arr[1]);let n = bstr.length;let u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new File([u8arr], fileName, {type: mime});
};

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

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

相关文章

如何在免费云Colab上使用扩散模型生成图片?

前言 在人工智能技术的迅猛发展下&#xff0c;内容生成领域也迎来了一系列创新的突破。其中&#xff0c;使用扩散模型&#xff08;如Stable Diffusion&#xff09;从文字生成图片的AI技术备受瞩目。这一技术的出现&#xff0c;为我们创造栩栩如生的图像提供了全新的可能性。本…

MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

目录 一、MongoDB 1.1、简介 a&#xff09;MongoDB 是什么&#xff1f;为什么要使用 MongoDB&#xff1f; b&#xff09;应用场景 c&#xff09;MongoDB 这么强大&#xff0c;是不是可以直接代替 MySQL &#xff1f; d&#xff09;MongoDB 中的一些概念 e&#xff09;Do…

k8s--动态pvc和pv

前情回顾 存储卷&#xff1a; emptyDir 容器内部&#xff0c;随着pod销毁&#xff0c;emptyDir也会消失 不能做数据持久化 hostPath&#xff1a;持久化存储数据 可以和节点上目录做挂载。pod被销毁了数据还在 NFS&#xff1a;一台机器&#xff0c;提供pod内容器所有的挂载点…

算法训练day11Leetcode20有效的括号1047删除字符串中所有相邻重复项150逆波兰表达式求值

今日学习的文章和视频链接 https://leetcode.cn/problems/valid-parentheses/description/ https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html 20 有效的括号 题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#…

使用emu8086实现——显示程序设计实验

一、实验目的 1. 掌握DOS系统功能调用的编程方法 2. 掌握汇编语言程序设计方法&#xff0c;自己编写程序&#xff0c;并调试运行验证结果。 二、实验内容 1.在显示器上的输出窗口显示A-Z共26个大写英文字母。 代码&#xff1a; datas segmentzimu db "A B C D E F G H …

git入门之本地操作

1、启动git命令输入 在想要建立仓库&#xff0c;建议的方式是在文件夹中右键单击&#xff0c;选择git bash here 2、初始化仓库命令&#xff1a;git init 3、查看仓库状态&#xff1a;git status 4、更新仓库特定文件&#xff1a;git add xxx 5、更新仓库所有文件&#xff1…

LLVM代码内容

1. LLVM简介 LLVM库包含所有LLVM顶层项目&#xff0c;可以分为以下几类&#xff1a; • LLVM核心库和附加内容 • 编译器和工具 • 运行时库 LLVM是一个编译器框架。LLVM作为编译器框架&#xff0c;是需要各种功能模块支撑起来的。可以将clang和lld都看做是LLVM的组成部分。…

老卫带你学---leetcode刷题(50. Pow(x, n))

50. Pow(x, n) 问题 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出…

RandLA-Net导出onnx模型并使用onnxruntime推理

首先下载RandLA-Net工程&#xff1a;https://github.com/tsunghan-wu/RandLA-Net-pytorch 导出onnx模型 import torch from utils.config import ConfigSemanticKITTI as cfg from network.RandLANet import Networkmodel Network(cfg) checkpoint torch.load("./pret…

Pandas实战100例 | 案例 13: 数据分类 - 使用 `cut` 对数值进行分箱

案例 13: 数据分类 - 使用 cut 对数值进行分箱 知识点讲解 在数据分析中&#xff0c;将连续的数值数据分类成不同的区间&#xff08;或“分箱”&#xff09;是一种常见的做法。Pandas 提供了 cut 函数&#xff0c;它可以根据你指定的分箱边界将数值数据分配到不同的类别中。 …

力扣(leetcode)第709题转成小写字母(Python)

709.转成小写字母 题目链接&#xff1a;709.转成小写字母 给你一个字符串 s &#xff0c;将该字符串中的大写字母转换成相同的小写字母&#xff0c;返回新的字符串。 示例 1&#xff1a; 输入&#xff1a;s “Hello” 输出&#xff1a;“hello” 示例 2&#xff1a; 输入&am…

浏览器进程模型和JS的事件循环

一、浏览器的进程模型 1、什么是进程&#xff1f; 程序运行所需要的专属内存空间 2、什么是线程&#xff1f; ​​​​​运行​代码的称为线程&#xff08;同一个进程中的线程共享进程的资源&#xff09; ⼀个进程⾄少有⼀个线程&#xff0c;所以在进程开启后会⾃动创建⼀个线…

ubuntu在使用su - root时提示认证失败

原因&#xff1a; 在ubuntu中&#xff0c;默认情况下&#xff0c;是没有开启root账户的&#xff0c;因此在输入密码的时候会显示认证失败。 解决方法&#xff1a; 输入sudo passwd root设置密码来激活root权限 参考链接&#xff1a;ubuntu出现su:Authentication failure解决方…

《剑指 Offer》专项突破版 - 面试题 7 : 数组中和为 0 的 3 个数字(C++ 实现)

题目链接&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 输入一个数组&#xff0c;如何找出数组中所有和为 0 的 3 个数字的三元组&#xff1f;需要注意的是&#xff0c;返回值中不得包含重复的三元组。例如&#xff0c;在数组 [-1, 0, …

【数值分析】数值微分

1. 基于Taylor公式的数值微分公式 f ′ ( x ) ≈ f ( x h ) − f ( x ) h , 截断误差 − f ′ ′ ( ξ ) 2 h f(x)\approx \frac{f(xh)-f(x)}{h}\,\,,\,\, 截断误差 \,\,\, - \frac{f(\xi)}{2}h f′(x)≈hf(xh)−f(x)​,截断误差−2f′′(ξ)​h f ′ ( x ) ≈ f ( x ) − f …

【JUC进阶】14. TransmittableThreadLocal

目录 1、前言 2、TransmittableThreadLocal 2.1、使用场景 2.2、基本使用 3、实现原理 4、小结 1、前言 书接上回《【JUC进阶】13. InheritableThreadLocal》&#xff0c;提到了InheritableThreadLocal虽然能进行父子线程的值传递&#xff0c;但是如果在线程池中&#x…

spring-mvc(1):Hello World

虽然目前大多数都是使用springboot来开发java程序&#xff0c;或者使用其来为其他端提供接口&#xff0c;而为其他端提供接口&#xff0c;这些功能都是依靠springmvc实现的&#xff0c;所以有必要学习一下spring-mvc&#xff0c;这样才能更好的学习springboot。 一&#xff0c…

c语言题目之九九乘法表的打印

文章目录 题目一、题目分析二&#xff0c;代码编写三&#xff0c;拓展 题目 用c语言打印九九乘法表 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目分析 在上面图我们假设一个乘法为一个单位&#xff0c;在这里我们可以看到第一行有一行一列&…

Python 3 字符串的基本使用

介绍 字符串是一个或多个字符&#xff08;字母、数字、符号&#xff09;的序列&#xff0c;可以是常量&#xff0c;也可以是变量。字符串由 Unicode 组成&#xff0c;是不可变的序列&#xff0c;这意味着它们是不变的。 由于文本是我们在日常生活中使用的一种常见数据形式&am…

掌握WPF控件:熟练常用属性(二)

WPF布局常用控件&#xff08;二&#xff09; Calendar 用于日期选择的控件。它提供了一个可视化的界面&#xff0c;可以通过它来选择特定的日期。 常用属性描述DisplayMode用来设置Calendar的显示模式&#xff0c;有三种可选值&#xff1a;默认Month&#xff08;月&#xff…