首页 > 其他分享 >了解blob和file对象,理解base64编码、unicode、utf-8编码

了解blob和file对象,理解base64编码、unicode、utf-8编码

时间:2025-01-21 11:54:46浏览次数:1  
标签:编码 const File Blob unicode utf type blob

blob对象

1.定义

  • Blob是Binary Large Object的缩写,表示二进制大对象。
  • MDN上对其的定义是:Blob 对象表示一个不可变、原始数据的类文件对象。可以通俗的说,Blob就是一只读的二进制对象。
  • 它并不是前端的所特有对象,而是计算机界的通用术语,在一些数据库中,例如,MYSQL中的BLOB类型就表示二进制数据的容器, 可以用来存储文件、图片、音频、视频、甚至是纯文本等各种类型的数据。

2.用法

Blob主要包含两个属性

  • Blob.size:只读,对象中所包含数据的大小(字节)
  • Blob.type:只读,一个字符串,表明该 Blob 对象所包含数据的 MIME 类型。如果类型未知,则该值为空字符串。(MIME类型参考

创建一个Blob对象,需要调用Blob构造函数。

  1. array: 一个数组,包含将被放入 Blob 对象中的数据,可以是字符串、数组缓冲区(ArrayBuffer)、TypedArray、Blob 对象等。
  2. options: 一个可选的对象,可以设置 type(MIME 类型)和 endings(用于表示换行符)。
const blob = new Blob(array, options);

// 创建Blob对象
    let blob;
    if(type == 'txt') blob = new Blob([text], { type: 'text/plain;charset=utf-8' });
    else if(type == 'pdf') blob = new Blob([text], { type: 'application/pdf' });
    else if(type == 'docx') blob = new Blob([text], { type: 'application/msword;charset=utf-8;' });
    else if(type == 'zip') blob = new Blob([text], { type: 'application/zip;' });

使用示例

const data1 = "a";
const data2 = "b";
const data3 = "<div style='color:red;'>This is a blob</div>";
const data4 = { "name": "abc" };
// 创建blob对象
const blob1 = new Blob([data1]);
const blob2 = new Blob([data1, data2]);
const blob3 = new Blob([data3], {type : 'text/html'});
const blob4 = new Blob([JSON.stringify(data4)]);
const blob5 = new Blob([data4]);
const blob6 = new Blob([data3, data4]);

console.log(blob1);  //输出:Blob {size: 1, type: ""}
console.log(blob2);  //输出:Blob {size: 2, type: ""}
console.log(blob3);  //输出:Blob {size: 44, type: "text/html"}
console.log(blob4);  //输出:Blob {size: 14, type: ""}
console.log(blob5);  //输出:Blob {size: 15, type: ""}
console.log(blob6);  //输出:Blob {size: 59, type: ""}

// 当使用普通对象创建Blob对象时,相当于调用了普通对象的toString()方法得到字符串数据,然后再创建Blob对象。所以,blob5保存的数据是"[object Object]",是15个字节(不包含最外层的引号)。

3.Blob目前有四个方法

Blob.slice([start[, end[, contentType]]]):返回一个新的 Blob 对象,包含了源 Blob 对象中指定范围内的数据。(由于File继承自Blob,可用此方法分割本地文件,实现分片上传)

Blob.stream():返回一个能读取blob内容的 ReadableStream

Blob.text():返回一个promise且包含blob所有内容的UTF-8格式的 USVString

Blob.arrayBuffer():返回一个promise且包含blob所有内容的二进制格式的 ArrayBuffer

4.blob使用场景

文件下载

export function downloadBlob(blob, filename) {
    // 创建URL
    const url = URL.createObjectURL(blob);
    // 创建a标签
    const link = document.createElement('a');
    link.style.display = 'none';
    link.href = url;
    link.setAttribute('download', filename);
    document.body.appendChild(link);
    // 触发下载
    link.click();
    // 清理
    document.body.removeChild(link);
    URL.revokeObjectURL(url);
}

CSV 或 Excel 数据生成

const data = [
  ["Name", "Age", "City"],
  ["Alice", "24", "New York"],
  ["Bob", "30", "San Francisco"],
];

const csvContent = data.map(row => row.join(',')).join('\n');
const blob = new Blob([csvContent], { type: 'text/csv' });

const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = "data.csv";
a.click();
URL.revokeObjectURL(url);

file对象

1.定义

  • File即我们通常所说的文件,我们硬盘里存储的音视频、文档等等都是文件。
  • MDN定义:文件(File)接口提供有关文件的信息,并允许网页中的 JavaScript 访问其内容。通常情况下, File 对象是来自用户在一个 <input> 元素上选择文件后返回的 FileList 对象,也可以是来自由拖放操作生成的 DataTransfer 对象,或者来自 HTMLCanvasElement 上的 mozGetAsFile() API。
  • File对象是Blob的子类,File 对象除了具有 Blob 的所有属性和方法之外,它包含了文件的元信息,如文件名、大小、修改时间等。File 对象通常由用户通过 <input type="file"> 选择文件时创建,也可以使用 JavaScript 构造函数手动创建。

2.File常用的属性

File.name 只读,返回当前File 对象所引用文件的名称。

File.size 只读,返回当前File 对象文件的大小。

File.type 只读,返回文件的多用途互联网邮件扩展类型(MIME Type)

3.用法

构造方法:

new File(array, name, options);

// 创建一个 File 对象
const file = new File(["Hello, File!"], "example.txt", { type: "text/plain", lastModified: Date.now() });
console.log(file); 
// File { name: "example.txt", size: 12, type: "text/plain", lastModified: 1695644303000 }

用户上传:

<input type="file" id="fileInput" />
<script>
  document.getElementById("fileInput").addEventListener("change", (event) => {
    const file = event.target.files[0];
    console.log("文件名:", file.name);
    console.log("文件类型:", file.type);
    console.log("文件大小:", file.size);
  });
</script>

base64编码

1.定义

base64编码 是一种基于 64 个可打印字符来表示二进制数据的方法。

base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME电子邮件XML的一些复杂数据。

2.ascll码

ASCII码一共规定了128个字符的编码,只占用了一个字节的后面7位,最前面的1位统一规定为0。

在 ASCII 码中 0 - 31和 127 是控制字符,共 33 个。其余 95 个,即 32 - 126 是可打印字符,包括数字、大小写字母、常用符号等。当不可见字符在网络上传输时,比如说从 A 计算机传到 B 计算机,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。

  为了解决这个问题,我们可以先对数据进行编码,比如 base64 编码,变成可见字符,也就是 ASCII 码可表示的可见字符,从而确保数据可靠传输。Base64 的内容是有 0 ~ 9,a ~ z,A ~ Z,+,/ 组成,正好 64 个字符,这些字符是在 ASCII 可表示的范围内,属于 95 个可见字符的一部分。

3.编码格式

Base64 就是一种基于 64 个可打印字符来表示二进制数据的表示方法
它的编码过程如下:

  • 将待转换的字符串每三个字节分为一组,每个字节占 8 个二进制位,那么共有 24 个二进制位。
  • 将第(1)步得到的每 24 个二进制位分为每 6 个一组,则每 3 个字节可分为 4 组。
  • 在每组前面添加两个 0 ,每组由 6 个二进制位变为 8 个二进制位,总共 32 个二进制位,即四个字节。

举例:

转换前 10101101 10111010 01110110

转换中 101011 011011 101001 110110
转换后 00101011 00011011 00101001 00110110 

对应码表中的值 r b p 2

base64要求把每三个8Bit字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。base64把一串二进制转换成另一种二进制串,以至于可以打印成英文、数字字符还有+、/.

4.base64 编码和解码

在 JavaScript 中,有两个函数被分别用来处理解码和编码 base64 字符串:

  • btoa():从字符串创建一个 base64 编码的 ASCII 字符串,其中字符串中的每个字符都被视为一个二进制数据字节。
  • atob():该函数能够解码通过 base64 编码的字符串数据。

unicode

Unicode又称为统一码、万国码、单一码,是国际组织制定的旨在容纳全球所有字符的编码方案,包括字符集、编码方案等,它为每种语言中的每个字符设定了统一且唯一的二进制编码,以满足跨语言、跨平台的要求。

Unicode 字符集

Unicode 为每个字符提供一个唯一数字(码点 code point),记为“U+xxxx”,其中xxxx是码位转换成16进制后的结果。

字符->码位的集合即 Unicode 字符集,也称作通用字符集(英语:Universal Character Set, UCS)。可在这里查询字符对应的码位。

Unicode 编码

Unicode 字符集规定了字符对应的唯一码点,但在实际的传输、存储过程中,为了兼顾各系统平台的差异、节省空间,需要对字符集进行编码——将对应的码点转换成另一种格式,即Unicode转换格式(Unicode Transformation Format,简称 UTF)。

Unicode 编码规则决定了码点如何在文件中显示,我们熟知的UTF-8 UTF-16就是编码规则的不同版本。

utf-8编码

UTF-8就是在互联网上使用最广的一种unicode的实现方式。UTF-8 是一种针对 Unicode 的可变长度字符编码,根据码点的大小,将其编码为 1 到 4 个字节。

简单来说,Unicode 是【字符集】,UTF-8 是字符集的一种【编码规则】。但广义来讲,它们是包含关系,如下图:

+-----------------------------+
|           Unicode           |
|  +-----------------------+  |
|  |     通用字符集(UCS)     |  |
|  +-----------------------+  |
|  +------------------------+ |
|  |   UCS转换格式(UTF)      |  |
|  | +-------------------+  | |
|  | | UTF-8, UTF-16 ... |  | |
|  | +-------------------+  | |
|  +------------------------+ |
|                             |
+-----------------------------+

 

 

 

 

 

 

 

 

标签:编码,const,File,Blob,unicode,utf,type,blob
From: https://www.cnblogs.com/wq805/p/18683369

相关文章

  • Java实现DES编码加解密 - 密钥为: Text
    编写工具类publicclassDesPasswordUtil{publicstaticfinalStringWIFI_DES_KEY="TmuhP9PD";/***生成密钥**@return{@linkString}*@throwsException例外*/publicstaticSecretKeySpeccreateKeyFromText(Stri......
  • Java实现DES编码加解密 - 密钥为: Hex
    编写工具类publicclassDesPasswordUtil{publicstaticfinalStringWIFI_DES_KEY="TmuhP9PDtcQ=";/***生成密钥**@return{@linkString}*@throwsException例外*/publicstaticStringgenerateKey()throwsExce......
  • 强大的Adobe ME(Adobe Media Encoder)视频编码和格式转换软件
    AdobeME软件简介AdobeME(AdobeMediaEncoder)是一款强大的视频编码和格式转换软件,专为视频制作、后期编辑和在线发布而设计。它是AdobeCreativeCloud的一部分,可以与AdobePremierePro和AfterEffects无缝集成。通过AdobeME,用户可以轻松地将视频文件转码为不同格式,调整编......
  • 解决数据库导入失败及字符编码不一致的问题
    当您在导入SQL文件时遇到500错误,并且需要确认数据库编码是否为UTF-8时,可以按照以下步骤进行排查和解决:备份现有数据:在执行任何数据库操作之前,请确保已经对现有数据进行了完整备份。可以通过导出当前数据库结构和数据的方式创建备份文件,以防止意外丢失重要信息。检查SQL......
  • H25:编码(选作)
    (......
  • 【陕西省乡镇界】面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移内容测
    标题中的“陕西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移.zip”表明这是一个地理信息系统(GIS)的数据集,专为陕西省的乡镇区域设计。该数据集以Shapefile(shp)格式提供,是GIS领域中最常用的数据交换格式之一。它包含了乡镇的边界信息,并且每个乡镇都......
  • 山西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移测评
    这篇文档将深入解析标题和描述中提及的IT知识点,主要关注地理信息系统(GIS)和ArcGIS软件的应用,以及shp文件格式的相关知识。我们要理解"山西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移.zip"这个标题。这里提到的“山西省乡镇界面图层”是指一个包......
  • 洛谷P1246 编码(运用组合数学解决问题)
    传送门:编码-洛谷题目描述编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有 2626 个字母 a,b,c,⋯ ,za,b,c,⋯,z,这些特殊的单词长度不超过 66 且字母按升序排列。把所有这样的单词放在一起,按字典......
  • Python 潮流周刊#86:Jupyter Notebook 智能编码助手(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,全文2000字。以下是本期摘要:......
  • 命令行终端的编码
    编码设置查看当前系统的编码,可以通过cmd命令行终端,运行chcp命令查看常见的有以下几种(GBK通常是中文系统的默认编码)936GBK437美国英语65001utf-8对于中文系统来说,GBK经常会导致一些终端窗口的乱码问题,可以设置全局的编码为65001打开注册表路径HKEY_LOCAL......