js中關于Blob對象的介紹與使用

js中關于Blob對象的介紹與使用

blob對象介紹

一個 Blob對象表示一個不可變的, 原始數據的類似文件對象。Blob表示的數據不一定是一個JavaScript原生格式 blob對象本質上是js中的一個對象,里面可以儲存大量的二進制編碼格式的數據。


創建blob對象

創建blob對象本質上和創建一個其他對象的方式是一樣的,都是使用Blob() 的構造函數來進行創建。 構造函數接受兩個參數:

第一個參數為一個數據序列,可以是任意格式的值。

第二個參數是一個包含兩個屬性的對象{ type: MIME的類型, endings: 決定第一個參數的數據格式,可以取值為 "transparent" 或者 "native"(transparent的話不變,是默認值,native 的話按操作系統轉換) 。 }

Blob()構造函數允許使用其他對象創建一個Blob對象,比如用字符串構建一個blob

var debug = {hello: "world"};
var blob = new Blob([JSON.stringify(debug, null, 2)],{type : 'application/json'});

既然是對象,那么blob也擁有自己的屬性以及方法

屬性

  • Blob.isClosed (只讀)

    布爾值,指示 Blob.close() 是否在該對象上調用過。 關閉的 blob 對象不可讀。

  • Blob.size (只讀)

    Blob 對象中所包含數據的大小(字節)。

  • Blob.type (只讀)

    一個字符串,表明該Blob對象所包含數據的MIME類型。如果類型未知,則該值為空字符串。

方法

  • Blob.close()

    關閉 Blob 對象,以便能釋放底層資源。

  • Blob.slice([start[, end[, contentType]]])

    返回一個新的 Blob 對象,包含了源 Blob 對象中指定范圍內的數據。其實就是對這個blob中的數據進行切割,我們在對文件進行分片上傳的時候需要使用到這個方法。

看到上面這些方法和屬性,使用過HTML5提供的File接口的應該都很熟悉,這些屬性和方法在File接口中也都有。 其實File接口就是基于Blob,繼承blob功能并將其擴展為支持用戶系統上的文件,也就是說:

File接口中的Flie對象就是繼承與Blob對象。

blob對象的使用

上面說了很多關于Blob對象的一些概念性的東西,下面我們來看看實際用途。


分片上傳

首先說說分片上傳,我們在進行文件上傳的時候,因為服務器的限制,會限制每一次上傳到服務器的文件大小不會很大,這個時候我們就需要把一個需要上傳的文件進行切割,然后分別進行上傳到服務器。

假如需要做到這一步,我們需要解決兩個問題:

  • 怎么切割?
  • 怎么得知當前傳輸的進度?

首先怎么切割的問題上面已經有過說明,因為File文件對象是繼承與Blob對象的,因此File文件對象也擁有slice這個方法,我們可以使用這個方法將任何一個File文件進行切割。

代碼如下:

復制代碼
var BYTES_PER_CHUNK = 1024 * 1024; // 每個文件切片大小定為1MB .
var blob = document.getElementById("file").files[0];
var slices = Math.ceil(blob.size / BYTES_PER_CHUNK);
var blobs = [];
slices.forEach(function(item, index) {blobs.push(blob.slice(index,index + 1));
});
復制代碼

通過上面的方法。我們就得到了一個切割之后的File對象組成的數組blobs;

接下來要做的時候就是講這些文件分別上傳到服務器。

在HTTP1.1以上的協議中,有Transfer-Encoding這個編碼協議,用以和服務器通信,來得知當前分片傳遞的文件進程。

這樣解決了這兩個問題,我們不僅可以對文件進行分片上傳,并且能夠得到文件上傳的進度。

粘貼圖片

blob還有一個應用場景,就是獲取剪切板上的數據來進行粘貼的操作。例如通過QQ截圖后,需要在網頁上進行粘貼操作。

粘貼圖片我們需要解決下面幾個問題

  1. 監聽用戶的粘貼操作

  2. 獲取到剪切板上的數據

  3. 將獲取到的數據渲染到網頁中

首先我們可以通過paste事件來監聽用戶的粘貼操作:

document.addEventListener('paste', function (e) {console.info(e);
});

然后通過事件對象中的clipboardData?對象來獲取圖片的文件數據。

clipboardData對象介紹

介紹一下 clipboardData 對象,它實際上是一個 DataTransfer 類型的對象, DataTransfer 是拖動產生的一個對象,但實際上粘貼事件也是它。

clipboardData 的屬性介紹

屬性類型說明
dropEffectString默認是 none
effectAllowedString默認是 uninitialized
filesFileList粘貼操作為空List
itemsDataTransferItemList剪切板中的各項數據
typesArray剪切板中的數據類型 該屬性在Safari下比較混亂

items 介紹

items 是一個 DataTransferItemList 對象,自然里面都是 DataTransferItem 類型的數據了。

屬性

items 的 DataTransferItem 有兩個屬性 kind 和 type

屬性說明
kind一般為 string 或者 file
type具體的數據類型,例如具體是哪種類型字符串或者哪種類型的文件,即 MIME-Type

方法

方法參數說明
getAsFile如果 kind 是 file ,可以用該方法獲取到文件
getAsStringfunction(str)如果 kind 是 string ,可以用該方法獲取到字符串str

在原型上還有一些其他方法,不過在處理剪切板操作的時候一般用不到了。

type 介紹

一般 types 中常見的值有 text/plain 、 text/html 、 Files 。

說明
text/plain普通字符串
text/html帶有樣式的html
Files文件(例如剪切板中的數據)

有了上面這些方法,我們可以解決第二個問題即獲取到剪切板上的數據。

復制代碼
document.addEventListener('paste', function (e) {console.info(e);var cbd = e.clipboardData;for(var i = 0; i < cbd.items.length; i++) {var item = cbd.items[i];console.info(item);if(item.kind == "file"){var blob = item.getAsFile();if (blob.size === 0) {return;}console.info(blob);}}
});
復制代碼

最后我們需要將獲取到的數據渲染到網頁上。

其實這個本質上就是一個類似于上傳圖片本地瀏覽的問題。我們可以直接通過HTML5的File接口將獲取到的文件上傳到服務器然后通過講服務器返回的url地址來對圖片進行渲染。也可以使用fileRender對象來進行圖片本地瀏覽。

fileRender對象簡介

從Blob中讀取內容的唯一方法是使用 FileReader。

FileReader接口有4個方法,其中3個用來讀取文件,另一個用來中斷讀取。無論讀取成功或失敗,方法并不會返回讀取結果,這一結果存儲在result屬性中。

方法名參數描述
readAsBinaryStringfile將文件讀取為二進制編碼
readAsTextfile,[encoding]將文件讀取為文本
readAsDataURLfile將文件讀取為DataURL
abort(none)終端讀取操作

FileReader接口包含了一套完整的事件模型,用于捕獲讀取文件時的狀態。

事件描述
onabort中斷
onerror出錯
onloadstart開始
onprogress正在讀取
onload成功讀取
onloadend讀取完成,無論成功失敗

通過上面的方法以及事件,我們可以發現,通過readAsDataURL方法及onload事件就可以拿到一個可本地瀏覽圖片的DataURL。

最終代碼如下:

復制代碼
document.addEventListener('paste', function (e) {console.info(e);var cbd = e.clipboardData;var fr = new FileReader();var html = '';for(var i = 0; i < cbd.items.length; i++) {var item = cbd.items[i];console.info(item);if(item.kind == "file"){var blob = item.getAsFile();if (blob.size === 0) {return;}console.info(blob);fr.readAsDataURL(blob);fr.on<x>load=function(e){var result=document.getElementById("result");//顯示文件result.innerHTML='<img src="' + this.result +'" alt="" />';}}}
});
復制代碼

這樣我們就可以監聽到用戶的粘貼操作,并且將用戶粘貼的圖片文件實時的渲染到網頁之中了。

總結

以上是我對Blob對象的一些學習分享,希望在實際應用上能對大家有所幫助。

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

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

相關文章

計算機應用基礎答案解析,計算機應用基礎答案

專業課作業1.一般認為&#xff0c;世界上第一臺電子數字計算機誕生于________。A.1946年2.當前的計算機一般被認為是第四代計算機&#xff0c;它所采用的邏輯元件是_______。C.大規模集成電路3、下列關于世界上第一臺電子計算機ENIAC的敘述中&#xff0c;錯誤的是_______。D.確…

光伏發展路線圖將發布 促產業優勝劣汰

工信部官網3月2日消息&#xff0c;工信部發布《2016年我國光伏產業運行情況》。2016年&#xff0c;我國光伏產業總產值達3360億元&#xff0c;同比增長27%。下一步將繼續發布《中國光伏產業發展路線圖》(2017年版)&#xff0c;推動應用光伏系統的新能源充電設施試點&#xff0c…

20170102-文件處理

文件處理 正常文件處理 python 文件處理 編碼 f open(file"兼職白領學生空姐模特護士練習方式.txt",mode"r",encoding"utf-8")#把值附給變量f &#xff08;路徑file"文件是兼職白領學生空姐模特護士練習方式.txt"&#xff0c;文本模式…

博世豪擲10億歐元德國建半導體工廠,要掌握自動駕駛芯片化核心競爭力?

日前&#xff0c;據路透社報道&#xff0c;全球頂級零部件供應商博世正在位于德國東部的德累斯頓市興建半導體工廠&#xff0c;總投資預計達10億歐元(約合11億美元)。據悉&#xff0c;此舉凸顯了博世對自動駕駛汽車以及工業物聯網方向的雙重布局。 據雷鋒網(公眾號&#xff1a;…

創建.NET程序Dump的幾種姿勢

當一個應用程序運行的有問題時&#xff0c;生成一個 Dump 文件來調試它可能會很有用。在 Windows、Linux 或 Azure 上有許多方法可以生成轉儲文件。Windows 平臺dotnet-dump (Windows)dotnet-dump 全局工具[1]是一種收集和分析.NET 核心應用程序 Dump 的方法。安裝 dotnet-dump…

計算機專業英語怎么翻譯,計算機專業英語翻譯(附件).pdf

Lesson 1. PC 概述概述概述概述提到 “技術”一詞&#xff0c;大多數人會想到計算機。我們生活中的幾乎每個方面都有一些計算機化的成份。家里的電器中內置了微處理器&#xff0c;電視機也是如此&#xff0c;就連汽車上面也有計算機。但是&#xff0c;人們首先想到的計算機通常…

自然語言處理怎么最快入門?

2019獨角獸企業重金招聘Python工程師標準>>> 本文整理自知乎上的一個問答&#xff0c;分享給正在學習自然然語言處理的朋友們&#xff01; 一、自然語言處理是什么&#xff1f; 自然語言處理說白了&#xff0c;就是讓機器去幫助我們完成一些語言層面的事情&#xff…

點分治題表

poj1741: tree bzoj2152: 聰聰可可 bzoj2599: [IOI2011]Race [SPOJ1825]免費旅行 bzoj4016: [FJOI2014]最短路徑樹問題 &#xff08;字典序挺騷&#xff09; 轉載于:https://www.cnblogs.com/TSHugh/p/8179241.html

dotnet-exec 0.8.0 released

dotnet-exec 0.8.0 releasedIntrodotnet-exec 是一個 C# 程序的小工具&#xff0c;可以用來運行一些簡單的 C# 程序而無需創建項目文件&#xff0c;而且可以自定義項目的入口方法&#xff0c;支持但不限于 Main 方法Install/Updatedotnet-exec 是一個 dotnet tool&#xff0c;可…

政策推動加速5G發展 全球統一標準成大勢所趨

2017IMT-2020(5G)峰會6月12日至13日在京召開。英特爾院士、通信與設備事業部無線標準首席技術專家吳耕對本網記者表示&#xff0c;未來5G技術不僅僅會以單個技術的身份去發展&#xff0c;它會和行業進行更多的融合。隨著行業的發展、平臺的發展、跨行業的融合&#xff0c;人們會…

普通高中段計算機學科知識,高中計算機學科的特點及教學內容淺探

摘要&#xff1a;為培養跨世紀接班人,發展和提高我國的計算機技術和水平,培養學生的計算機意識,普及計算機文化,提高科學文化素質,許多中學都相繼開設了計算機課程,計算機課程將逐步成為中小學的一門獨立的知識性與技能性相結合的基礎性學科.計算機課程的開設,豐富了基礎教育的…

Siamese Network理解

提起siamese network一般都會引用這兩篇文章&#xff1a; 《Learning a similarity metric discriminatively, with application to face verification》和《 Hamming Distance Metric Learning》。 本文主要通過論文《Learning a Similarity Metric Discriminatively, with A…

HashMap是如何工作的

2019獨角獸企業重金招聘Python工程師標準>>> 1 HashMap在JAVA中的怎么工作的&#xff1f; 基于Hash的原理 2 什么是哈希&#xff1f; 最簡單形式的 hash&#xff0c;是一種在對任何變量/對象的屬性應用任何公式/算法后&#xff0c; 為其分配唯一代碼的方法。 一個真…

英特爾布局5G 提供端到端的解決方案

錯失了移動互聯設備市場的英特爾&#xff0c;想在5G和物聯網上搶得先機。 在英特爾5G行業發展沙龍上&#xff0c;英特爾院士、通信與設備事業部無線標準首席技術專家吳耕表示&#xff0c;全球對5G產業有相當高的期待&#xff0c;下一代網的研發重心就是從以人為本的網向以物為本…

計算機網絡實驗進入實時模式,計算機網絡實驗1 PacketTrace基本使用.doc

計算機網絡實驗1 PacketTrace基本使用太原理工大學現代科技學院計算機通信網絡課程 實驗報告專業班級學 號姓 名指導教師 實驗名稱 同組人專業班級 學號 姓名 成績一、實驗目的掌握Cisco Packet Tracer 軟件的使用方法。二、實驗任務在Cisco Packet Tracer 中用HUB 組建局域網&…

adb不識別設備(手機)的若干情形及解決方法

1.執行adb root 提示adb: unable to connect for root: no devices/emulators found&#xff1b;執行adb devices ,List下無設備 》往往是數據線或USB插口問題&#xff0c;換根數據線或換個USB插口試試 2.執行adb devices List下提示 “592b925b no permissions (verify ud…

如何做到十五分鐘領略PowerBI的DAX精華及框架

有小伙伴問&#xff0c;如何最快速理解整套 DAX 精華體系&#xff0c;例如&#xff1a;15分鐘。這雖然是個不可能完成的任務&#xff0c;但在借助腦圖PPT的強大能力下&#xff0c;還是可以做到的。如果你從沒接觸過 DAX&#xff0c;但未來要學習 DAX&#xff0c;以下視頻值得看…

php html 轉xml,用PHP生成XML文檔(轉義字符)

用PHP生成XML文檔(轉義字符)我正在從PHP腳本生成XML文檔&#xff0c;并且需要轉義XML特殊字符。我知道應該轉義的字符列表&#xff1b; 但是正確的方法是什么&#xff1f;應該使用反斜杠(\)來轉義字符還是正確的方法&#xff1f;有內置的PHP函數可以為我處理此問題嗎&#xff1…

【例題 8-13 UVA - 11093】Just Finish it up

【鏈接】 我是鏈接,點我呀:) 【題意】 在這里輸入題意 【題解】 尺取法。 假設現在取[l..r]這一段。 然后發現累加的和小于0了。 那么方法只能是不走l..l1這一段了 即delta遞減(p[l]-q[l]); 直到delta>0為止。 某個時刻如果發現r1l 或者l1且rn 則合法。 如果發現l大于n了.…

springboot配置允許跨域訪問

2019獨角獸企業重金招聘Python工程師標準>>> 因springboot框架通常用于前后端分離項目&#xff0c;因此需配置后臺允許跨域訪問&#xff08;具體看注釋&#xff09;&#xff0c;配置類如下&#xff0c;將該類加入工程中即可。 import org.springframework.context.a…