前言:前端
直接經過new Blob()
就能夠建立一個Blob對象ajax
var aBlob = new Blob( array, options );
array(可選):是一個由ArrayBuffer, ArrayBufferView, Blob, DOMString 等對象構成的 Array ,或者其餘相似對象的混合體。(暫時能夠不用理解,就能夠看做是一堆數據)
options(可選):一個對象,用來
設置Blob的一些屬性。主要的是一個type屬性,表示Blob的類型(其餘暫時也不用管)。
簡單來講,就是能夠經過向new Blob()傳一堆數據,生成一個Blob對象數據庫
Blob.size(只讀):Blob對象中包含的數據大小(字節)
Blob.type(只讀):代表該Blob對象所包含數據的MIME類型。例如若爲圖片,此字段就相似爲’image/jpeg‘。若是類型未知,則該值爲空字符串。數組
Blob只有一個slice方法,實現對文件的分割(注意這裏並不違背Blob的只讀性,slice只是只是複製指定範圍內的Blob數據)。dom
Blob.slice(start, end ,contentType)
start:開始索引,能夠爲負數,語法相似於數組的slice方法。默認值爲0。
end:結束索引,能夠爲負數,語法相似於數組的slice方法。默認值爲最後一個索引。
contentType:新的Blob對象的MIME類型,這個值將會成爲新的Blob對象的type屬性的值,默認爲一個空字符串。異步
簡單來講,Blob就是一個只讀的二進制文件,咱們能夠知道它的文件大小(size),文件類型(type),並能夠對其做出分割(slice)。wordpress
ArrayBuffer的概念和用法相對比較複雜(它自己不復雜,只是使用方式比較豐富),以後會在另一篇博客做出解釋,這裏僅作簡要說明,主要是理解它的宏觀概念。函數
blob與ArrayBuffer的關係工具
- 相同點: Blob和ArrayBuffer都是二進制的容器;
- ArrayBuffer:ArrayBuffer更底層,就是一段純粹的內存上的二進制數據,咱們能夠對其任何一個字節進行單獨的修改,也能夠根據咱們的須要以咱們指定的形式讀取指定範圍的數據
- Blob:Blob就是將一段二進制數據作了一個封裝,咱們拿到的就是一個總體,能夠看到它的總體屬性大小、類型;能夠對其分割,但不能瞭解到它的細節
- 聯繫:Blob能夠接受一個ArrayBuffer做爲參數生成一個Blob對象,此行爲就至關於對ArrayBuffer數據作一個封裝,以後就是以總體的形式展示了
- 應用上的區別:因爲ArrayBuffer和Blob的特性,Blo做爲一個總體文件,適合用於傳輸;而只有須要關注細節(好比要修改某一段數據時),才須要用到ArrayBuffer
<input type="file">
選擇的FileList對象,或者是使用拖拽操做搞出的DataTransfer對象。這裏就不作過多介紹了,能夠直接參考MDN上的介紹編碼
file就是blob裏面的一個小類,繼承Blob的方法和屬性,擁有本身特有的屬性。一般表示<input type="file">
裏的fileList對象
經過fileReader能夠將Blob讀取爲不一樣的格式,具體將在另外一篇博文中講到。
Q:前面提到,ArrayBuffer也須要藉助工具(以dataView爲例)讀取數據,那和fileReader有什麼區別呢?
A:我理解的,ArrayBuffer的工具dataView只是簡單的讀取數據,最多就是講數據轉爲數字或字符串;但fileReader能夠看作是多了一道編碼的過程,經過FileReader.readAsDataURL(blob)就是將二進制數據讀取並編碼爲Base64格式,FileReader.readAsText(blob)就是將二進制數據讀取並編碼爲字符串形式。
準確來講,FormData其實與上述內容關係就不大了。它是XMLHttpRequest Level 2添加的一個新的接口,咱們能夠經過JavaScript用一些鍵值對來模擬一系列表單控件。FormData的最大優勢就是,比起普通的ajax, 使用FormData咱們能夠異步上傳一個二進制文件,而這個二進制文件,就是咱們上面講的Blob對象。