前端小技巧:利用Blob對象切片上傳大文件

1.什麼是Blob對象?

Blob對象表示二進制文件的數據內容,並且可以操作二進制文件,因此它常用於讀寫文件。

Blob對象的構造函數Blob()由瀏覽器原生提供,實例化對象如下:

let blob=new Blob(["my name is martin"],{type:"application/json"})

可以看出,Blob構造函數接受兩個參數。

  • 第一個參數是數組,數組元素可以是字符串或二進制文件,用來表示Blob實例對象的數據內容。
  • 第二個參數是配置對象,但是目前該對象只有一個type屬性可提供配置,它的值是一個字符串,表示數據的MIME類型,默認是空字符串,關於MIME類型分類,可以參照以下這張表:
前端小技巧:利用Blob對象切片上傳大文件

2.Blob對象的屬性和方法

2.1Blob屬性

廢話不多說,先直接打印一個Blob對象給大家看看:

let blob=new Blob(["my name is martin"],{type:"application/json"});
console.log(blob);
前端小技巧:利用Blob對象切片上傳大文件

可以看出,一個Blob實例對象包含兩個屬性:

  • size:表示數據的大小
  • type:表示數據的MIME類型

2.2Blob方法

Blob實例對象只有一個slice方法,這個方法和數組的slice方法很像,都是用來切割數據的,切割完返回一個相同類型的數據。這裡返回的是一個Blob對象。

slice用法詳解

yourBlob.slice(start, end, contentType);

可以看出Blob對象的slice方法包含三個參數:

  • start:切割起始位置(包含)
  • end:切割結束位置(不包含)
  • contentType:返回的新Blob對象的數據類型(默認為空字符串)

上個小例子幫大家理解一下:

切割文件簡易版:

代碼:

let blob=new Blob(["my name is martin"],{type:"application/json"});
let newBlob_1=blob.slice(0,3,"application/json");
let newBlob_2=blob.slice(3,blob.size,"application/json");
console.log(blob);
console.log(newBlob_1);
console.log(newBlob_2); 

結果圖:

前端小技巧:利用Blob對象切片上傳大文件

分析:從結果圖中可以看出,初始Blob對象大小為17,最後被切割成兩個大小為3和14的Blob對象,如果將初始Blob對象的數據看成是一個文件,那麼這段代碼的作用就是直接將一個大文件分片成兩個小文件了。

事實上,文件的分片原理就是這樣,用Blob對象將文件分片是不是很簡單。

3.如何使用Blob對象實現分片上傳

上面說的都是Blob對象的基礎知識點,這一part講的工程實踐應用才是重頭戲。

3.1前置知識點

因為我們工程中很多是基於 這個文件選擇器來上傳文件的。

這個文件選擇器返回的是一個FileList類數組對象,其中數組中的每個元素都是一個File實例對象。

而這個File對象其實就是一個特殊的Blob對象實例,它除了繼承了Blob對象所有的屬性和方法,還新增了name和lastModifiedDate這兩個屬性。

File對象用法示例:

 let file=new File(["my name is martin"],"myFile",{type:"text/plain",lastModified:new Date()})
 console.log(file);
//File構造函數接受三個參數:
//第一個參數是數組,表示數據內容 
//第二個參數是文件名
//第三個參數是一個對象,包含type和lastModified屬性
前端小技巧:利用Blob對象切片上傳大文件

3.2大文件分片上傳實例(這段代碼要著重理解)

廢話不多說,先上完整代碼:



 
 Title



 
 


以上代碼就實現了大文件的分片上傳功能,具體運用到工程中的演示效果如下所示:

前端小技巧:利用Blob對象切片上傳大文件

4.總結

大文件分片上傳時,一般是使用Blob的特殊實例對象File來對文件進行切分,然後使用FormData對象來儲存分片文件,最後利用ajax請求向服務端發送分片文件。對於FormData對象不瞭解的同學可以翻看我的FormData用法解析這一篇文章。

關注我,一起學習前端,共同從小白走向高級工程師。


分享到:


相關文章: