前端文件流處理--工作經(jīng)驗(yàn)分享

筆者之前遇了好幾處需要處理文件流的場景哩盲,以及互相轉(zhuǎn)換狈醉,這邊深入的學(xué)習(xí)了一下它們的概念,區(qū)別以及互相轉(zhuǎn)換苗傅,閱讀本文你將了解前端常見的文件流格式,以及相互轉(zhuǎn)換的思路嘶炭。

1.概念

File

一般情況之下File對象是input標(biāo)簽選擇文件之后的FileList對象逊桦,也可以是也可以是來自由拖放操作生成的 DataTransfer 對象,或者來自 HTMLCanvasElement 上的 mozGetAsFile() API睡陪。

File是特殊的Blob匿情,可以處理Blob的函數(shù)必然可以處理Blob,比如說汁果, FileReader, URL.createObjectURL(), createImageBitmap() (en-US), 及 XMLHttpRequest.send() 都能處理 BlobFile玲躯。

總結(jié):File是一個(gè)特殊的Blob對象鲸伴。具體API參見MDN File

Base64

Base64是一種由64個(gè)可打印字符組成的對二進(jìn)制編碼的規(guī)則(binary-to-text)

Base64解決了什么問題晋控?

Base64就是為了解決各系統(tǒng)以及傳輸協(xié)議中二進(jìn)制不兼容的問題而生的。為什么Base64能實(shí)現(xiàn)兼容呢仲吏?主要還是因?yàn)楦骷蚁到y(tǒng)只能保證ASIIC的基礎(chǔ)字符蝌焚,所以Base64就是取了其中的64個(gè) 參見MDN Base64

Base64的算法:

  • 1.將原始數(shù)據(jù)每三個(gè)字節(jié)作為一組许帐,每個(gè)字節(jié)是8個(gè)bit毕谴,所以一共是 24 個(gè) bit

  • 2.將 24 個(gè) bit 分為四組,每組 6 個(gè) bit

  • 3.在每組前面加補(bǔ) 00涝开,將其補(bǔ)全成四組8個(gè)bit,到此步拄养,原生數(shù)據(jù)的3個(gè)字節(jié)已經(jīng)變成4個(gè)字節(jié)了银舱,增大了將近30%

  • 4.根據(jù)Base64碼表得到擴(kuò)展后每個(gè)字節(jié)的對應(yīng)符號
    小tips:

關(guān)于Base64結(jié)尾的’=‘,而且有時(shí)候是一個(gè)有時(shí)候是兩個(gè)棋弥,這是因?yàn)閎ase64是以三個(gè)字符為一組操软,所以當(dāng)不滿三個(gè)的時(shí)候就會用’=‘補(bǔ),缺一個(gè)補(bǔ)一個(gè)’=‘家乘,缺兩個(gè)補(bǔ)兩個(gè)’=’藏澳。

其實(shí)在實(shí)際開發(fā)中,我們得到的是DataURL前面一般會有data:image/jpeg;base64,需要注意的是,之后的才是真正的數(shù)據(jù)翔悠。

Blob

Blob是一個(gè)表示不可變野芒,原始數(shù)據(jù)的文件對象狞悲,它的數(shù)據(jù)可以按文本或者二進(jìn)制的格式進(jìn)行讀取妇斤,也可以轉(zhuǎn)換成 ReadableStream 來用于數(shù)據(jù)操作。 具體API參見MDN Blob

可以用Blob實(shí)現(xiàn)對大文件進(jìn)行分片上傳站超。

ArrayBuffer

ArrayBuffer 對象用來表示通用的、固定長度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)融求。

它是一個(gè)字節(jié)數(shù)組算撮,通常在其他語言中稱為“byte array”

ArrayBuffer 的內(nèi)容不能直接被操作 茅糜,而是要通過類型數(shù)組對象或 DataView 對象來操作素挽,將緩沖區(qū)中的數(shù)據(jù)表示為特定的格式狸驳,并通過這些格式來讀寫緩沖區(qū)的內(nèi)容。

2.互相轉(zhuǎn)換

在日常開發(fā)中我們經(jīng)常遇到一些api或者組件對文件類型有要求撰糠,只這時(shí)候就需要對這些文件類型進(jìn)行轉(zhuǎn)化辩昆。

在這在之前先介紹一下一個(gè)JS BOM API FileReader

FileReader可以讀取Blob對象所以同時(shí)也能讀取File對象,并且FileReader提供了輸出ArrayBuffer Base64的接口术辐。

下面直接貼一些轉(zhuǎn)換代碼:

File轉(zhuǎn)Base64:

  let reader = new FileReader();
  reader.readAsDataURL(file[0])
  console.log(reader)

Base64轉(zhuǎn)Blob:

const dataURItoBlob = (dataURI) => {  
    var byteString = atob(dataURI.split(',')[1]);  
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];  
    var ab = new ArrayBuffer(byteString.length);  
    var ia = new Uint8Array(ab);  
    for (var i = 0; i < byteString.length; i++) {  
        ia[i] = byteString.charCodeAt(i);  
    }  
    return new Blob([ab], {type: mimeString});  
}

Blob轉(zhuǎn)ArrayBuffer:

let blob = new Blob([1,2,3,4])
let reader = new FileReader();
reader.onload = function(result) {
    console.log(result);
}
reader.readAsArrayBuffer(blob);

Buffer轉(zhuǎn)Blob:

let blob = new Blob([buffer])

Base64轉(zhuǎn)File:

const base64ConvertFile = function (urlData, filename) {
    if (typeof urlData != 'string') {
        return;
    }
    var arr = urlData.split(',')
    var type = arr[0].match(/:(.*?);/)[1]
    var fileExt = type.split('/')[1]
    var bstr = atob(arr[1])
    var n = bstr.length
    var u8arr = new Uint8Array(n)
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], 'filename.' + fileExt, {
        type: type
    });
}

總結(jié):

前端常見的文件流格式有Blob File Base64 ArrayBuffer辉词,其中File是特殊的Blob對象,大部分轉(zhuǎn)換都可以通過JS BOM API FileReader實(shí)現(xiàn)猾骡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敷搪,一起剝皮案震驚了整個(gè)濱河市幢哨,隨后出現(xiàn)的幾起案子捞镰,更是在濱河造成了極大的恐慌,老刑警劉巖曼振,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰评,死亡現(xiàn)場離奇詭異,居然都是意外死亡甲雅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門弛姜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妖枚,“玉大人,你說我怎么就攤上這事荠商⌒” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵饰躲,是天一觀的道長臼隔。 經(jīng)常有香客問我,道長躬翁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任例嘱,我火速辦了婚禮拼卵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腋腮。我一直安慰自己,他們只是感情好徊哑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布聪富。 她就那樣靜靜地躺著,像睡著了一般梢莽。 火紅的嫁衣襯著肌膚如雪奸披。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天轻局,我揣著相機(jī)與錄音膜钓,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拾枣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播司蔬,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姨蝴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了授帕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彤路,失蹤者是張志新(化名)和其女友劉穎芥映,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奈偏,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惊来,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年内狸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昆淡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刽严。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舞萄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倒脓,到底是詐尸還是另有隱情,我是刑警寧澤甘晤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布饲做,位于F島的核電站,受9級特大地震影響盆均,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜游沿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望循集。 院中可真熱鬧蔗草,春花似錦、人聲如沸咒精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽范咨。三九已至,卻和暖如春输吏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背替蛉。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工贯溅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躲查。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓它浅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镣煮。 傳聞我的和親對象是個(gè)殘疾皇子姐霍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容