一文了解Blob文件格式,前端必備技能之一

文章目錄

  • 前言
  • 一、什么是Blob?
  • 二、Blob的基本特性
  • 三、Blob的構造函數
  • 四、常見使用場景
    • 1. 文件下載
    • 2. 圖片預覽
    • 3. 大文件分片上傳
  • 四、Blob與其他API的關系
    • 1. File API
    • 2. FileReader
    • 3. URL.createObjectURL()
    • 4. Response
  • 五、性能與內存管理
  • 六、實際案例:導出Word文檔
  • 七、瀏覽器兼容性
  • 八、總結


在這里插入圖片描述

前言

最近在項目中需要導出文檔時,我首次接觸到了 Blob 文件格式。作為一個前端開發者,雖然經常聽到 "Blob" 這個術語,但對其具體原理和應用場景并不十分了解。經過一番研究和實踐,我決定將所學整理成文,與大家分享 Blob 技術的奧秘。

一、什么是Blob?

Blob(Binary Large Object,二進制大對象)是 JavaScript 中用于表示二進制數據的一個對象。它本質上是一個不可變的、原始數據的類文件對象,可以存儲大量的二進制數據。

// 創建一個簡單的Blob對象
const blob = new Blob(["Hello, world!"], { type: 'text/plain' });

二、Blob的基本特性

  • 不可變性:一旦創建,Blob 對象的內容無法直接修改
  • 類型標識:通過 MIME 類型標識數據格式
  • 大小存儲:可以存儲大量二進制數據
  • 分片能力:可以被分割成更小的 Blob 對象

三、Blob的構造函數

Blob構造函數接受兩個參數:

new Blob(blobParts, options);
  • blobParts:由ArrayBuffer、ArrayBufferView、Blob、DOMString等對象構成的數組
  • options:可選參數,包含兩個屬性:
    • type:Blob內容的MIME類型
    • endings:指定包含行結束符\n的字符串如何寫入

四、常見使用場景

1. 文件下載

function downloadFile(content, filename, type) {const blob = new Blob([content], { type });const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = filename;a.click();URL.revokeObjectURL(url);
}// 使用示例
downloadFile('Hello, world!', 'example.txt', 'text/plain');

2. 圖片預覽

function previewImage(file) {const blob = URL.createObjectURL(file);const img = document.createElement('img');img.onload = function() {URL.revokeObjectURL(this.src); // 釋放內存};img.src = blob;document.body.appendChild(img);
}// 使用示例
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (e) => {previewImage(e.target.files[0]);
});

3. 大文件分片上傳

function uploadLargeFile(file, chunkSize = 1024 * 1024) {let offset = 0;const fileSize = file.size;while (offset < fileSize) {const chunk = file.slice(offset, offset + chunkSize);// 上傳chunk...offset += chunkSize;}
}

四、Blob與其他API的關系

1. File API

File 對象繼承自 Blob ,在Blob基礎上增加了文件名、最后修改時間等元數據。

2. FileReader

用于讀取 BlobFile 對象的內容:

const reader = new FileReader();
reader.onload = function(e) {console.log(e.target.result);
};
reader.readAsText(blob);

3. URL.createObjectURL()

創建指向 Blob 對象的 URL ,可用于預覽或下載。

4. Response

Fetch APIResponse 對象可以將 Blob 作為響應體:

fetch(url).then(response => response.blob()).then(blob => {// 處理blob});

五、性能與內存管理

使用Blob時需要注意:

  1. 內存釋放:通過 URL.revokeObjectURL() 及時釋放不再需要的Blob URL
  2. 大文件處理:對于大文件,考慮使用 slice() 方法分塊處理
  3. Worker線程:處理大型 Blob 時可在 Web Worker 中進行以避免阻塞主線程

六、實際案例:導出Word文檔

最近我在項目中需要將 HTML 內容導出為 Word 文檔,使用 Blob 技術可以輕松實現:

function exportAsWord(html, filename = 'document.doc') {// Word文檔的HTML模板const template = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="UTF-8"><title>Document</title></head><body>${html}</body></html>`;// 創建Blob對象const blob = new Blob([template], {type: 'application/msword'});// 創建下載鏈接const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = filename;document.body.appendChild(a);a.click();// 清理document.body.removeChild(a);URL.revokeObjectURL(url);
}

七、瀏覽器兼容性

大多數現代瀏覽器都支持Blob API,包括:

  • Chrome 20+
  • Firefox 13+
  • Safari 6+
  • Edge 12+
  • Opera 15+

對于IE10及以下版本,需要使用替代方案如 msSaveBlobFileSaver.js 等polyfill。

八、總結

Blob 作為 Web 開發中處理二進制數據的重要工具,在文件操作、多媒體處理、數據存儲等場景中發揮著關鍵作用。通過本文的介紹,相信大家對 Blob 技術有了更深入的理解。在實際開發中,合理使用 Blob 可以大大提升應用的性能和用戶體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909834.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LLMs 系列實操科普(4)

六、deep research 這是 chatgpt 推出的功能&#xff0c;但我這里是免費用戶&#xff0c;一個月才有 5 次使用機會&#xff0c;而且使用的是輕量化模型版本&#xff0c;相對體驗上比較雞肋一些。 那這個深度思考研究是個什么東西呢&#xff1f; 根據 openai 對其的解釋是&…

若依框架前端調用后臺服務報跨域錯誤

背景&#xff1a;使用若依框架的前后端分離項目&#xff0c;前后端開發在同一個辦公室情況下前端調用后端服務提示如下報錯&#xff1a;Access to XMLHttpRequest at http://ip1:8089/online/layer/dataType from origin http://ip2:6090 has been blocked by CORS policy: Res…

PHP商城源碼:構建高效電商平臺的利器

一、PHP商城源碼的核心優勢 1. **開源免費&#xff0c;降低成本** PHP作為開源語言&#xff0c;擁有龐大的開發者社區&#xff0c;成熟的商城源碼&#xff08;如EcShop、OpenCart&#xff09;可免費獲取&#xff0c;大幅降低企業的技術投入成本。 2. **開發效率高** PHP語法…

【學習筆記】C++代碼規范整理

【學習筆記】C代碼規范整理 一、匿名空間namespace 匿名命名空間&#xff08;Anonymous Namespace&#xff09;是一種特殊的命名空間聲明方式&#xff0c;其作用是將聲明的成員限定在當前編譯單元&#xff08;源文件&#xff09;內可見&#xff0c;類似于使用 static 關鍵字修…

數學復習筆記 29 不定積分

前言 復習的時候時常復習一下以前復習的高數&#xff0c;溫故而知新&#xff0c;可以為師矣。現實生活中有非常多讓我難受的事情&#xff0c;賢者模式的時候也會對一些自己的行為嗤之以鼻&#xff0c;復習考研對其他三門科目都沒有學出來正反饋&#xff0c;只能從數學這兒找一…

微軟因安全漏洞禁用黑暗環境下的Windows Hello面部識別功能

面部識別技術在各種場景中的應用日益廣泛&#xff0c;但身份欺詐事件仍時有發生&#xff0c;這表明即使面部識別也并非萬無一失。在某些情況下&#xff0c;這些系統可能被攻擊者利用。 漏洞發現與應對措施 近期&#xff0c;微軟在Windows 10和11系統中禁用了黑暗環境下使用Wi…

產品經理課程(十五)實戰點評(3)

&#xff08;一&#xff09;復習 需求文檔是產品的說明書 需求文檔包含&#xff1a;修訂記錄、背景、主要流程、詳細功能邏輯、數據上報&#xff0c;發布策略 bug也是需求文檔的一部分 &#xff08;二&#xff09;案例講解 案例一&#xff1a; 一個版本里面的4-5個功能點就比…

大模型量化與剪枝

大模型量化&#xff0c;剪枝 量化有助于減少顯存使用并加速推理 GPTQ 等后訓練量化方法(Post Training Quantization)是一種在訓練后對預訓練模型進行量化的方法。 ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3### export export_di…

Oracle 數據庫數據操作:精通 INSERT, UPDATE, DELETE

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月18日 專欄&#xff1a;Oracle教程 在 Oracle 數據庫中&#xff0c;對表內數據進行增加、修改和刪除操作是通過數據操作語言 (DML - Data Manipulation Language) 來完成的。核心的DML語句包括 INSERT (插入新數據), UPDATE…

推薦使用的Unity插件(InputSystem)

本文將提供更簡潔的步驟和常見問題解決。 一、極簡入門步驟&#xff1a; 安裝&#xff1a;Package Manager中安裝Input System&#xff08;確保Unity版本在2019.4&#xff09; 創建Input Actions&#xff1a; 在Project窗口右鍵 -> Create -> Input Actions 雙擊打開…

清理 Docker 容器日志文件方法

操作總結與問題解析 一、操作目的與背景 用戶旨在清理 Docker 容器日志文件以釋放服務器存儲空間,主要通過以下命令組合完成操作: 查看容器日志空間占用清空指定容器的日志文件驗證容器運行狀態與日志清理效果二、關鍵命令與輸出解析 1. 查看 Docker 容器日志空間占用 du…

圖片壓縮工具 | 按指定高度垂直切割圖片

OPEN-IMAGE-TINY&#xff0c;一個基于 Electron VUE3 的圖片壓縮工具&#xff0c;項目開源地址&#xff1a;https://github.com/0604hx/open-image-tiny ?? 需求描述 在上一篇文章一段代碼利用 snapdom 將 CSDN 博文轉化為長圖片&#xff08;PNG/JPG/PDF&#xff09;中&…

山東大學軟件學院創新項目實訓開發日志——第十七周(二)

目錄 1.優化前端日歷頁面顯示&#xff0c;增加鼠標懸停顯示當日會議基本信息的效果。 2.優化會議計劃生成與會議PPT生成功能&#xff0c;使得能夠加載多頁docx文件與PDF文件 3.優化了會議PPT生成功能&#xff0c;使得可以上傳多個文件并根據多個文件生成會議PPT 4.修改了識…

Ubuntu 使用kubeadm部署k8s系統組件反復重啟的問題

系統&#xff1a;Ubuntu 24.04 LTS 問題現象&#xff1a;kubeadm init 后系統組件proxy、apiserver、etcd等頻繁掛掉重啟 問題原因&#xff1a;cgroup配置問題 解決方法&#xff1a; 編輯系統cgroup默認配置文件 sudo nano /etc/default/grub 將GRUB_CMDLINE_LINUX_DEFAU…

Oracle獲取執行計劃之EXPLAIN PLAN 技術詳解

#Oracle #執行計劃 #EXPLAIN PLAN 一、引言 在Oracle數據庫性能優化中&#xff0c;?執行計劃&#xff08;Execution Plan&#xff09;?是理解SQL語句如何被數據庫處理的關鍵工具。EXPLAIN PLAN是Oracle提供的一種靜態分析SQL執行路徑的方法&#xff0c;它通過生成邏輯執行…

【論文閱讀】Qwen2.5-VL Technical Report

Arxiv:https://arxiv.org/abs/2502.13923 Source code:https://github.com/QwenLM/Qwen2.5-VL Author’s Institution&#xff1a;Alibaba 背景 多模態大模型 多模態大模型MultiModal Large Language Models (MM-LLMs) 的發展可以通過一篇綜述了解&#xff1a;MM-LLMs: Re…

vue中computed和watch區別

在 Vue 中&#xff0c;computed 和 watch 都是用來響應式地處理數據變化的工具&#xff0c;但它們的用途和行為有明顯區別。 &#x1f50d; 一句話總結 computed&#xff1a;用于聲明式計算屬性&#xff0c;有緩存。 watch&#xff1a;用于監聽響應式數據的變化并執行副作用邏…

大語言模型:提示詞決定自我反思效果: “檢查回答是否錯誤” “驗證回答是否正確”

大語言模型(LLMs)自我反思的結果很容易受提示詞構造的影響 大型語言模型(LLMs)展現出令人印象深刻的零樣本和少樣本推理能力。有人提出,這些能力可以通過自我反思來提升,即讓大型語言模型反思自己的輸出,以識別和糾正初始回答中的錯誤。然而,盡管有一些證據表明自我反…

【iReport】實際開發中,解決iReport中打印圖片不顯示問題

ireport 中增加圖片&#xff0c;添加上屬性&#xff0c;但是運行時報錯如下&#xff0c;是屬性logoPath沒有聲明到map中 1. Parameter not found : logoPath net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 1. Parameter not fo…

【MySQL進階】常用MySQL程序

目錄 一. mysqlcheck——表維護程序 1.1.作用 1.2 注意事項 1.3 使用方法 1.4 常用選項 1.5 mysqlcheck的特殊使用 二. mysqldump——數據庫備份程序 2.1.作用 2.2 注意事項 2.3 使用方法 2.4 常用選項 三. mysqladmin——MySQL 服務器管理程序 3.1.作用 3.2 使用…