什么是Blob API?它在现代Web开发中扮演什么角色?

Blob API 使用指南

一、

blob api

Blob(Binary Large Object)表示二进制类型的大对象,通常用于存储影像、声音或多媒体文件,在 JavaScript 中,Blob 类型的对象表示不可变的类似文件对象的原始数据,通过 Blob API,可以创建、操作和传输 Blob 对象。

二、Blob 构造函数

Blob 构造函数用于创建一个新的 Blob 对象,语法如下:

var aBlob = new Blob(blobParts, options);

blobParts:一个由 ArrayBuffer、ArrayBufferView、Blob 或 DOMString 等对象构成的数组,DOMStrings 会被编码为 UTF-8。

options:一个可选的对象,包含以下两个属性:

type:默认值为空字符串,表示 Blob 对象的 MIME 类型。

endings:默认值为 "transparent",用于指定包含行结束符

的字符串如何被写入,它有两个可能的值:"native" 和 "transparent"。

blob api

示例一:从字符串创建 Blob

let myBlobParts = ['<html><h2>Hello Semlinker</h2></html>']; // an array consisting of a single DOMString
let myBlob = new Blob(myBlobParts, {type : 'text/html', endings: "transparent"}); // the blob
console.log(myBlob.size + " bytes size"); // Output: 37 bytes size
console.log(myBlob.type + " is the type"); // Output: text/html is the type

示例二:从类型化数组和字符串创建 Blob

let hello = new Uint8Array([72, 101, 108, 108, 111]); // binary format of "hello"
let blob = new Blob([hello, ' ', 'semlinker'], {type: 'text/plain'});

三、Blob 属性和方法

1. 属性

size(只读):表示 Blob 对象中所包含数据的大小(以字节为单位)。

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

2. 方法

slice([start[, end[, contentType]]]):返回一个新的 Blob 对象,包含了源 Blob 对象中指定范围内的数据。

blob api

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

text():返回一个 Promise 对象且包含 blob 所有内容的 UTF-8 格式的 USVString。

arrayBuffer():返回一个 Promise 对象且包含 blob 所有内容的二进制格式的 ArrayBuffer。

需要注意的是,Blob 对象是不可改变的,我们不能直接在一个 Blob 中更改数据,但可以通过分割 Blob 对象来创建新的 Blob 对象。

四、Blob 使用场景

1. 分片上传

File 对象是特殊类型的 Blob,且可以用在任意的 Blob 类型的上下文中,所以针对大文件传输的场景,可以使用 slice 方法对大文件进行切割,然后分片进行上传,具体示例如下:

const file = new File(["a".repeat(1000000)], "test.txt");
const chunkSize = 40000;
const url = "https://httpbin.org/post";
async function chunkedUpload() {
    for (let start = 0; start < file.size; start += chunkSize) {
        const chunk = file.slice(start, start + chunkSize + 1);
        const fd = new FormData();
        fd.append("data", chunk);
        await fetch(url, { method: "post", body: fd }).then((res) =>
            res.text()
        );
    }
}

2. 从互联网下载数据

我们可以使用以下方法从互联网上下载数据并将数据存储到 Blob 对象中:

const downloadBlob = (url, callback) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.responseType = 'blob';
    xhr.onload = () => {
        callback(xhr.response);
    };
    xhr.send(null);
};

3. Blob 用作 URL

Blob 对象可以与 URL.createObjectURL() 一起使用,创建一个本地的 URL,指向该 Blob 对象,这个 URL 可以用于图像、音频或其他媒体资源。

const myBlob = new Blob(['Hello, world!'], {type: 'text/plain'});
const url = URL.createObjectURL(myBlob);
console.log(url); // 输出类似 "blob:http://example.com/abcdef"

4. Blob 转换为 Base64

将 Blob 对象转换为 Base64 编码的字符串,可以方便地将其嵌入到其他文本数据中。

function blobToBase64(blob) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onloadend = () => resolve(reader.result);
        reader.onerror = reject;
        reader.readAsDataURL(blob);
    });
}
// Example usage:
blobToBase64(new Blob(['Hello, world!'])).then((base64) => {
    console.log(base64); // 输出 Base64 编码的字符串
});

5. 图片压缩

通过 Blob API,可以将图片文件读取为 Blob,然后进行处理,如压缩后再保存为新的 Blob。

function compressImage(file, callback) {
    const reader = new FileReader();
    reader.onload = (e) => {
        const img = new Image();
        img.onload = () => {
            const canvas = document.createElement('canvas');
            canvas.width = img.width;
            canvas.height = img.height;
            const ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0);
            canvas.toBlob(callback);
        };
        img.src = e.target.result;
    };
    reader.readAsDataURL(file);
}
// Example usage:
compressImage(new File([""], "image/png")).then((compressedBlob) => {
    console.log(compressedBlob); // 处理后的 Blob 对象
});

6. 生成 PDF

结合 HTML5 和 Blob API,可以动态生成 PDF 文件。

function generatePDF() {
    const doc = new jsPDF();
    doc.text(20, 20, 'Hello world!');
    doc.save('test.pdf');
}

7. Blob 与 ArrayBuffer 的区别

虽然 Blob 和 ArrayBuffer 都可以用来处理二进制数据,但它们有一些不同之处:

Blob:主要用于文件操作,支持大文件,适合用于分片上传和下载。

ArrayBuffer:主要用于在内存中操作二进制数据,适合需要频繁读写的小数据块操作。

五、相关问题与解答

1. Blob 和 File 有什么区别?

Blob:是一种通用的二进制数据容器,适用于各种类型的数据,包括文件和其他二进制数据,Blob 对象是不可变的。

File:是特殊类型的 Blob,专门用于表示用户系统上的文件,File 对象继承了 Blob 的属性和方法,并增加了一些特定的功能,如文件名和文件最后修改日期等。

2. 如何在前端使用 Blob API 实现文件的分片上传?

要在前端使用 Blob API 实现文件的分片上传,可以按照以下步骤进行:

1、选择文件并将其读入 Blob 对象。

2、使用slice 方法将文件切割成多个小片段。

3、使用FormData 对象和fetch API 将这些片段逐一上传到服务器,示例代码如下:

const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (event) => {
    const file = event.target.files[0];
    const CHUNK_SIZE = 1024 * 1024; // 1MB per chunk
    const url = 'YOUR_UPLOAD_ENDPOINT';
    const uploadChunk = async (chunk) => {
        const formData = new FormData();
        formData.append('file', chunk);
        await fetch(url, { method: 'POST', body: formData });
    };
    for (let start = 0; start < file.size; start += CHUNK_SIZE) {
        const end = Math.min(file.size, start + CHUNK_SIZE);
        const chunk = file.slice(start, end);
        uploadChunk(chunk);
    }
});

到此,以上就是小编对于“blob api”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/700003.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seoK-seo
Previous 2024-12-03 10:14
Next 2024-12-03 10:19

相关推荐

  • 米拓建站质量怎么样

    米拓建站是一款非常优秀的网站建设工具,它为用户提供了丰富的模板、强大的功能和便捷的操作,让用户可以轻松地创建出专业、高质量的网站,下面我们将从多个方面来详细介绍米拓建站的特点和优势。1. 丰富的模板资源米拓建站拥有大量的模板资源,涵盖了各种行业和类型的网站,用户可以根据自己的需求选择合适的模板进行定制,这些模板的设计风格独特,色彩搭配……

    2023-11-27
    0104
  • 云服务器哪家好用又实惠

    云服务器哪家好?随着云计算技术的快速发展,越来越多的企业和个人开始使用云服务器,云服务器可以为企业提供弹性扩展、按需付费、数据安全等多种优势,如何选择一家好的云服务器提供商呢?本文将从以下几个方面进行详细介绍。品牌背景与口碑选择一家好的云服务器提供商,首先要关注其品牌背景和口碑,知名品牌通常具有较强的技术实力和稳定的服务,而用户评价则……

    2024-01-29
    0172
  • 域名转移失败的原因是什么

    域名转移失败的原因是什么?在互联网时代,域名已经成为企业和个人建立网络形象的重要标识,在进行域名转移的过程中,可能会遇到一些问题导致转移失败,本文将详细分析域名转移失败的原因,并提供相应的解决方案。技术原因1、域名注册商限制部分域名注册商可能会对域名转移设置一定的限制,例如需要支付额外的费用、需要提前通知等,如果在规定时间内未能满足这……

    2023-12-16
    0184
  • 服务器迁移最佳实践是什么?

    服务器迁移最佳实践一、迁移前准备1. 评估与规划业务影响分析:评估迁移对业务的影响,确定关键业务系统及其依赖关系,资源需求评估:收集CPU、磁盘、网络和内存等资源的数据,以确定物理服务器是否适合迁移,以及在虚拟化主机上是否需要特殊配置,迁移策略选择:根据迁移的必要参数(如正常运行时间、许可证参数等),选择适合的……

    2024-12-09
    020
  • 服务器管理器中的文件服务器是什么?如何有效利用它?

    服务器管理器中的文件服务器一、文件服务器基础说明文件服务器是企业中最常用的服务器之一,主要用于提供文件共享服务,从Windows Server 2008开始,文件服务器资源管理器被引入,以增强文件管理功能,其主要功能包括:文件分类基础结构:通过自动分类流程提供对数据的洞察力,从而更有效地管理数据,基于文件类型进……

    2024-12-25
    05
  • C#中怎么使用OleDbConnection连接读取Excel

    在C#中,使用OleDbConnection连接读取Excel文件,首先需要添加System.Data.OleDb命名空间,然后创建一个OleDbConnection对象,设置连接字符串,最后打开连接并执行查询。,,``csharp,using System.Data.OleDb;,,// 创建OleDbConnection对象,OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=文件路径;Extended Properties='Excel 12.0 Xml;HDR=YES'");,,// 打开连接,connection.Open();,,// 执行查询,OleDbCommand command = new OleDbCommand("SELECT * FROM [工作表名$]", connection);,OleDbDataReader reader = command.ExecuteReader();,,// 读取数据,while (reader.Read()),{, Console.WriteLine(reader[0].ToString());,},,// 关闭连接,reader.Close();,connection.Close();,``

    2024-01-24
    0197

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入