JS開發(fā)Blob和FileReader構(gòu)造函數(shù)使用示例詳解
Blob
Blob
對象表示一個不可變,原始數(shù)據(jù)的類文件對象。它的數(shù)據(jù)可以按文本或二進(jìn)制的格式進(jìn)行讀取。
Blob
表示的不一定是javascript原生格式的數(shù)據(jù),File
接口基于Blob
,繼承了blob的功能并將其擴(kuò)展使其支持用戶系統(tǒng)上的文件
要從其他非blob對象和數(shù)據(jù)構(gòu)造一個Blob
,請使用Blob()
構(gòu)造函數(shù)。如果要創(chuàng)建blob
的子集,可以使用slice
方法。
構(gòu)造函數(shù)
Blob()構(gòu)造函數(shù)返回一個新的Blob對象,blob的內(nèi)容由參數(shù)數(shù)組中給出的值的串聯(lián)組成
const aBlob = new Blob(array[, options])
構(gòu)造函數(shù)接受兩個參數(shù),第一個參數(shù)是數(shù)組,成員是字符串或二進(jìn)制對象等,表示新生成的Blob實(shí)例對象的內(nèi)容。第二個參數(shù)可選,表示配置對象,有兩個屬性,type,默認(rèn)值為空字符串,表示將會被放入到blob中的數(shù)組內(nèi)容的MIME類型;endings,默認(rèn)值是"transpartent",用于指定包含行結(jié)束符的字符串如何被寫入。
示例
const obj = { hello: 'world' } const blob = new Blob([JSON.stringify(obj)], { type: 'application/json' }) console.log(blob); // Blob {size: 17, type: 'application/json'}
實(shí)例屬性
- Blob.size:只讀,Blob對象中所包含數(shù)據(jù)的大?。ㄗ止?jié))
- Blob.type:只讀,一個字符串,表示該Blob對象所包含數(shù)據(jù)的MIME類型,如果類型未知,則該值為空字符串
實(shí)例方法
- Blob.text():返回一個Promise且包含blob所有內(nèi)容的UTF-8格式的
USVString
- Blob.arrayBuffer():返回一個Promise且包含blob所有內(nèi)容的二進(jìn)制格式的
ArrayBuffer
- Blob.stream():返回一個能讀取blob內(nèi)容的
ReadableStream
Blob.slice([start[, end[, contentType]]]):返回一個新的Blob對象,包含了源Blob對象中指定范圍內(nèi)的數(shù)據(jù)
- start:可選,Blob里的起始下標(biāo),如果為負(fù)數(shù),從數(shù)據(jù)的末尾開始從后往前計算,默認(rèn)值0,如果start的長度大于源Blob的長度,返回一個長度為0并且不包含任何數(shù)據(jù)的Blob對象
- end:可選,Blob里的一個下標(biāo),如果為負(fù)數(shù),從數(shù)據(jù)的末尾開始從后往前計算,默認(rèn)值為源Blob的長度
- contentType:可選,給新的Blob賦予一個新的文檔類型 type,默認(rèn)值為空字符串
blob.slice(1, 3, 'application/json') // Blob {size: 2, type: 'application/json'} blob.slice(33, 3) // Blob {size: 0, type: ''}
從Blob中提取數(shù)據(jù)
一種從Blob中讀取內(nèi)容的方法是使用FileReader
下載文件
相關(guān)知識點(diǎn):
URL.createObjectURL()
URL.createObjectURL()
會創(chuàng)建一個DOMString,其中包含一個表示參數(shù)中給出的對象的URL,這個URL的生命周期和創(chuàng)建它的窗口中的document綁定。這個新的URL對象表示指定的File對象或Blob對象。返回值格式 blob:URL
在每次調(diào)用createObjectURL()
方法時,都會創(chuàng)建一個新的URL對象,即使你已經(jīng)用相同的對象作為參數(shù)創(chuàng)建過。當(dāng)不需要這些URL對象時,每個對象必須調(diào)用URL.revokeObjectURL()
方法來釋放。
URL.revokeObjectURL()
URL.revokeObjectURL()
方法用來釋放一個之前已經(jīng)存在的,通過調(diào)用URL.createObjectURL()
方法創(chuàng)建的URL對象。當(dāng)你結(jié)束使用某個URL對象之后,應(yīng)該通過調(diào)用這個方法來讓瀏覽器知道不用在內(nèi)存中繼續(xù)保留對這個文件的引用了。
function download(blob){ const url = URL.createObjectURL(blob) const link = document.createElement('a') document.body.appendChild(link) link.download = file.name // download屬性指定文件名 link.href = url // 為href屬性指定下載鏈接 link.click() // 觸發(fā)link的click事件 document.body.removeChild(link) URL.revokeObjectURL(url) } // download方法傳入的參數(shù)可以是File對象也可以是Blob對象
讀取文件內(nèi)容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <input type="file" id="input"> <button onclick="getFile()">提交</button> <script> function getFile() { let fileDom = document.querySelector('#input') console.log(fileDom.files) const file = fileDom.files[0] const reader = new FileReader() reader.readAsText(file, 'UTF-8') reader.onload = function() { console.log(reader.result) } } </script> </body> </html>
FileReader
FileReader
對象允許Web應(yīng)用程序異步讀取存儲在用戶計算機(jī)上的文件的內(nèi)容,使用File
或Blob
對象指定要讀取的文件或內(nèi)容。
注意:FileReader僅用于以安全的方式從用戶(遠(yuǎn)程)系統(tǒng)讀取文件內(nèi)容,它不能用于從文件系統(tǒng)中按路徑名簡單的讀取文件。要在js中按路徑名讀取文件,應(yīng)使用標(biāo)準(zhǔn)Ajax解決方案進(jìn)行服務(wù)器端文件讀取。
構(gòu)造函數(shù)
使用FileReader()
構(gòu)造器去創(chuàng)建一個新的FileReader
const reader = new FileReader()
實(shí)例屬性
- FileReader.error:只讀,表示在讀取文件時發(fā)生的錯誤,一個DOMException
FileReader.readyState:只讀,表示FileReader狀態(tài)的數(shù)據(jù)
- 值為0,表示還沒加載任何數(shù)據(jù),EMPTY
- 值為1,表示數(shù)據(jù)正在被加載,LOADING
- 值為2,表示已完成全部的讀取請求,DONE
reader = new FileReader() console.log(reader.readyState) // 0 reader.readAsText(file, 'UTF-8') console.log(reader.readyState) // 1 reader.onload = function() { console.log(reader.readyState) // 2 }
- FileReader.result:只讀,文件的內(nèi)容,該屬性僅在讀取操作完成后才有效,數(shù)據(jù)的格式取決于使用哪種方法來啟動讀取操作
實(shí)例方法
- FileReader.abort():中止讀取操作,在返回時,readyState屬性為DONE
FileReader
對象提供了四個方法,處理Blob對象,Blob對象作為參數(shù)傳入這些方法,然后以指定的格式返回
- FileReader.readAsText():將Blob或File對象根據(jù)特殊的編碼格式轉(zhuǎn)換為字符串形式內(nèi)容,可以指定文本編碼,默認(rèn)UTF-8。常用來讀取文本文件
- FileReader.readAsArrayBuffer():將Blob或File對象讀取的文件數(shù)據(jù)轉(zhuǎn)換為一個ArrayBuffer對象
- FileReader.readAsBinaryString():將Blob或File對象讀取的文件數(shù)據(jù)轉(zhuǎn)換為文件原始二進(jìn)制格式,該特性是非標(biāo)準(zhǔn)的,盡量不要在生產(chǎn)環(huán)境使用
- FileReader.readAsDataURL():將Blob或File對象讀取的文件數(shù)據(jù)轉(zhuǎn)換為包含一個
data:
URL格式的字符串(Base64編碼)
事件處理
- FileReader.onloadstart:處理loadstart事件,該事件在讀取操作開始時觸發(fā)
- FileReader.onload:處理load事件,該事件在讀取操作完成時觸發(fā)
- FileReader.onloadend:處理loadend事件,該事件在讀取操作結(jié)束時(要么成功,要么失?。┯|發(fā)
- FileReader.onerror:處理error事件,該事件在讀取操作發(fā)生錯誤時觸發(fā)
- FileReader.onabort:處理abort事件,該事件在讀取操作被中斷時觸發(fā)
- FileReader.onprogress:處理progress事件,該事件在讀取Blob時觸發(fā)
reader = new FileReader() reader.readAsText(file, 'UTF-8') reader.onloadstart = function() { console.log("start"); } reader.onprogress = function() { console.log("progress"); } reader.onload = function() { console.log("load") } reader.onloadend = function() { console.log("end") } // start // progress // load // end
以上就是JS開發(fā)Blob和FileReader構(gòu)造函數(shù)使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于JS構(gòu)造函數(shù)Blob FileReader的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何使用mock.js實(shí)現(xiàn)接口測試的自動化
這篇文章主要為大家介紹了如何使用mock.js實(shí)現(xiàn)接口測試的自動化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06判斷Spartacus?SSR的Transfer?State是否正常工作技巧
這篇文章主要為大家介紹了判斷Spartacus?SSR的Transfer?State是否正常工作技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10微信小程序 支付功能實(shí)現(xiàn)PHP實(shí)例詳解
這篇文章主要介紹了微信小程序 支付功能實(shí)現(xiàn)PHP實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05JavaScript設(shè)計模式之命令模式和狀態(tài)模式詳解
這篇文章主要為大家介紹了JavaScript設(shè)計模式之命令模式和狀態(tài)模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08umi插件開發(fā)仿dumi項目實(shí)現(xiàn)基礎(chǔ)路由解析
這篇文章主要為大家介紹了umi插件開發(fā)仿dumi項目實(shí)現(xiàn)基礎(chǔ)路由解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01ECharts transform數(shù)據(jù)轉(zhuǎn)換和dataZoom在項目中使用
這篇文章主要為大家介紹了ECharts transform數(shù)據(jù)轉(zhuǎn)換和dataZoom在項目中使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12