HTML5 file對象和blob對象的互相轉換

原文地址:https://blog.div-wang.com/2017/07/html5-file.html

最近在做一個裁剪圖片的需求,基于vue和elementui寂殉,裁剪完圖片遇到一個坑,elementui的upload組件接受一個promise,要求promise resolve一個File對象才可以使用新文件上傳那先,而canvas是轉成了blob對象,我google查了好久赡艰,沒有發(fā)現有blob對象轉File的文章售淡,所以今天來寫一個吧!

使用FileReader 對象轉換:File => DataURL

該對象用于讀取文件(讀取單個對象文件,所以揖闸,不能直接讀取 Filelist 對象文件集合)苦掘,即把文件內容讀入內存。它接收 File 對象或 Blob 對象楔壤,作為參數鹤啡。

生成該對象的構造函數方法如下:
  var reader = new FileReader(); // 參數為 Blob 對象或 File 對象
對于不同類型的文件,FileReader 使用不同的方法讀取蹲嚣。方法如下:
  • readAsBinaryString(Blob|File):返回二進制字符串递瑰,該字符串每個字節(jié)包含一個 0 到 255 之間的整數。
  • readAsText(Blob|File, opt_encoding) :返回文本字符串隙畜。默認情況下抖部,文本編碼格式是'UTF-8',可以通過可選的格式參數议惰,指定其他編碼格式的文本慎颗。
  • readAsDataURL(Blob|File):返回一個基于 Base64 編碼的 data-uri 對象。
  • readAsArrayBuffer(Blob|File) :返回一個 ArrayBuffer(數組緩存)對象言询。
  • abort():該方法用于中止文件上傳俯萎。
下面是獲取上傳對象的文本內容的方法:
    var reader = new FileReader();
    reader.onload = function(e){
        // target.result 該屬性表示目標對象的DataURL
        console.log(e.target.result);
    }
    // 傳入一個參數對象即可得到基于該參數對象的文本內容
    reader.rederAsDataURL(file);

利用canvas剪切圖片

CanvasRenderingContext2D.drawImage() 是 Canvas 2D API 中的方法,它提供了多種方式來在Canvas上繪制圖像运杭,我們使用drawImage方法節(jié)剪切圖片夫啊。

先從canvas獲取剪切過的圖片DataURL
    // 獲取canvas
    let ctx = this.$refs.canvas.getContext('2d')
    // 獲取圖片dom元素
    let image = this.$refs.image
    // 裁剪圖片200 * 200圖片
    ctx.drawImage(image, x, y, w, h, 0, 0, 200, 200)
    // canvas生成剪切過的圖片DataURL
    this.cutAvater = this.$refs.canvas.toDataURL()

具體的裁剪方法我下篇文章會寫

將dataurl轉換為Blob對象
    let arr = this.cutAvater.split(',')
    let data = window.atob(arr[1])
    let mime = arr[0].match(/:(.*?);/)[1]
    let ia = new Uint8Array(data.length)
    for (var i = 0; i < data.length; i++) {
      ia[i] = data.charCodeAt(i)
    }
    this.blob = new Blob([ia], {type: mime})

利用File Api講blob轉成File對象

其實我google找了一圈只有 File => Blob,沒人寫怎么用Blob => File 最終我在File中找到了File()構造函數

    let files = new window.File([this.blob], file.name, {type: file.type})

File()構造函數的前兩個參數為必傳

參考:

Blob

File

File.File()

CanvasRenderingContext2D.drawImage()

文件和二進制數據的操作

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末辆憔,一起剝皮案震驚了整個濱河市撇眯,隨后出現的幾起案子,更是在濱河造成了極大的恐慌虱咧,老刑警劉巖熊榛,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異腕巡,居然都是意外死亡玄坦,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門逸雹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來营搅,“玉大人云挟,你說我怎么就攤上這事梆砸。” “怎么了园欣?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵帖世,是天一觀的道長。 經常有香客問我,道長日矫,這世上最難降的妖魔是什么赂弓? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮哪轿,結果婚禮上盈魁,老公的妹妹穿的比我還像新娘。我一直安慰自己窃诉,他們只是感情好杨耙,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飘痛,像睡著了一般珊膜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宣脉,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天车柠,我揣著相機與錄音,去河邊找鬼塑猖。 笑死竹祷,一個胖子當著我的面吹牛,可吹牛的內容都是我干的羊苟。 我是一名探鬼主播溶褪,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼践险!你這毒婦竟也來了猿妈?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤巍虫,失蹤者是張志新(化名)和其女友劉穎彭则,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體占遥,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡俯抖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了瓦胎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芬萍。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搔啊,靈堂內的尸體忽然破棺而出柬祠,到底是詐尸還是另有隱情,我是刑警寧澤负芋,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布漫蛔,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏莽龟。R本人自食惡果不足惜蠕嫁,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毯盈。 院中可真熱鬧剃毒,春花似錦、人聲如沸搂赋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厂镇。三九已至纤壁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捺信,已是汗流浹背酌媒。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迄靠,地道東北人秒咨。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像掌挚,于是被迫代替她去往敵國和親雨席。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容