XMLHttpRequest對象(2)-上傳部分

一、引言

本文會詳細介紹XMLHttpRequest上傳部分及相關的理論知識笋粟。

不了解XMLHttpRequest對象的同學請移步XMLHttpRequest對象API部分

二屈扎、假象XMLHttpRequest對象不存在

在介紹上傳這部分知識前埃唯,我思考了如何讓剛接觸這部分的前端人員更好地理解文件上傳。

1鹰晨、首先假象XMLHttpRequest對象不存在

2墨叛、我(你應該想是你)是開發(fā)瀏覽器文件上傳接口的負責人

3、最簡單的一個思路:

1)獲取電腦磁盤文件的控件或接口(file表單控件)

2)上傳到瀏覽器內存中的控件或接口(FileReader)

3)JavaScript腳本上傳到服務器端的接口(XMLHttpRequest的upload屬性)

1模蜡、file表單控件

1)基本屬性

<input type="file" id="file" name="fileName" multiple="multiple"/>

name:控件名稱

multiple:是否支持多選

注意 name一般是服務器端給定的字段

文件過濾選擇框(個人感覺慎用漠趁,篩選速度特別慢,可以做上傳前的文件驗證)

<input type="file" accept="application/msexcel" /> ?
accept屬性列表

1.accept="application/msexcel"

2.accept="application/msword"

3.accept="application/pdf"

4.accept="application/poscript"

5.accept="application/rtf"

6.accept="application/x-zip-compressed"

7.accept="audio/basic"

8.accept="audio/x-aiff"

9.accept="audio/x-mpeg"

10.accept="audio/x-pn/realaudio"

11.accept="audio/x-waw"

12.accept="image/gif"

13.accept="image/jpeg"

14.accept="image/tiff"

15.accept="image/x-ms-bmp"

16.accept="image/x-photo-cd"

17.accept="image/x-png"

18.accept="image/x-portablebitmap"

19.accept="image/x-portable-greymap"

20.accept="image/x-portable-pixmap"

21.accept="image/x-rgb"

22.accept="text/html"

23.accept="text/plain"

24.accept="video/quicktime"

25.accept="video/x-mpeg2"

26.accept="video/x-msvideo"

2)獲取控件信息

var file = document.getElementById('file').files

file類型為數組

file[i]儲存每個上傳文件的一些信息哩牍,如下圖:

控件信息截圖

注意:經過測試上傳各種類型文件棚潦,打印出來的type屬性,有些文件type屬性為空膝昆,所以所以想檢查文件類型的話丸边,建議取name屬性 利用indexOf()檢查叠必,file控件信息只能檢查文件名是否符合要求,如果想要檢查文件里面的一些內容或屬性妹窖,可能需要通過其他前端接口實現纬朝,下面奉上文件大小轉化的一個小方法。

function readFileSize(file,retain){

? ? ?let formatSize='';

? ? ?let size = file.size/1024;

? ? ?let typeArr=["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];

? ? ? if(size<1){

? ? ? ? ? formatSize=file.size+'Byte'

? ? ? ? }else{

? ? ? ? ? ? ? for(let i=0;size>1;size=size/1024,i++){

? ? ? ? ? ? ? ? ? formatSize=size.toFixed(retain)+typeArr[i]

? ? ? ? ? ? ?}

? ? ? ? ?}

? ? ?return formatSize

}

只用JavaScript初始化?file對象還有待研究骄呼,以后會深入研究共苛,請往下看,來介紹文件上傳的三大巨頭之一 FileReader對象

2蜓萄、FileReader

1)定義

<1>html5新增加的接口

<2>JavaScript對象

<3>將磁盤文件讀取到瀏覽器內存中

<4>初始化 var readFile = new FileReader()


readFile對象

2)method

readFile.readAsBinaryString(file) ? ? ?將文件讀取為二進制編碼

readFile.readAsText(file,[encoding]) ? ? 將文件讀取為文本 編碼默認為utf-8

readFile.readAsDataURL(file) ? ? ? ? ? ? ? ? 將文件讀取為DataURL

abort ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 中斷讀取操作

3)event

onabort ? ? ? ? ? ?中斷讀取

onerror ? ? ? ? ? ?讀取出錯

onloadstart ? ? 開始讀取

onprogress ? ? ?正在讀取

onload ? ? ? ? ? ? ? 成功讀取

onloadend ? ? ? ? 讀取完成(無論成功還是失斢缇ァ)

FileReader與XMLHttpRequest有些類似,你可以把readAsBinaryString ?readAsText readAsDataUrl類比成send方法,FileReader相對簡單一些嫉沽,沒有readyState屬性和open方法辟犀,兩者區(qū)別是 FileReader是從本地上傳文件到瀏覽器,XMLHttpRequest是從本地上傳到服務器端绸硕,兩者根本是依賴file控件對文件進行一些處理堂竟。

3、FormData

1)模擬表單控件

2)上傳二進制文件

3)初始化 var formdata = new FormData(data)

data類型為dom對象 可以傳遞form表單 file

4)append()方法 (可以添加file對象或者blob對象)

formdata.append('name',[file或者blob對象],'fileName')

formdata.append()

FormData實例對象

4玻佩、Blob對象

1)File接口是基于Blob

2)Blob對象可以看做是存放二進制數據的容器出嘹,此外還可以通過Blob設置二進制數據的MINE類型

3)MINE類型

MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型咬崔,當該擴展名文件被訪問的時候税稼,瀏覽器會自動使用指定應用程序來打開,下圖附上常見的MIME類型刁赦,百度搜的娶聘,所以可能存在錯誤,請抱著懷疑的態(tài)度使用此圖


MINE常見類型

4)初始化 var blob = new Blob(dataArr:Array<any>,opt:{type:string});

dataArr:數組甚脉,數據類型可以是任意多個ArrayBuffer,ArrayBufferView,Blob或者DOMString對象

opt:對象,用于設置Blob對象的屬性(如:MIME類型)

5)blob.size 實例的長度

6)blob.slice(start,end,MIME)?

slice方法跟JavaScript很多對象(如字符串)的方法基本一樣铆农,多了第三個參數(見上文)

多說一句牺氨,利用這個方法可以做大文件分割,上傳墩剖,未來的幾篇中會有介紹猴凹,到時候會有連接,敬請期待岭皂。?

7)blob.close()

釋放底層內存資源

8)ArrayBuffer ArrayBufferView 的介紹 有一篇文章介紹很全面了(這個部分適合單獨寫一篇文章)

https://www.cnblogs.com/copperhaze/p/6149041.html

5郊霎、XMLHttpRequest upload屬性

1)本文的重頭角色 文件上傳

前面說了這么多,都是知識鋪墊爷绘,文件上傳书劝,一句話:

通過FormData .append(name,data,fileName)將數據傳遞給后端


upload屬性

2)XMLHttpRequest的upload屬性进倍,著重說一下onprogress這個事件,其他事件不明白的回到第一篇重新看购对。

xhr.upload.onprogress=function(event){

//上傳中的一些屬性猾昆,這個事件是異步的

var total = event.total;

var loaded = event.load

var progress = Number(loaded/total).toFixed(2)*100+'%'

console.log(progress)

}

3)下載進度進度事件

XMLHttpRequest.onprogress=function(event){

? ? ? // 這個后面會介紹到

}


xhr.upload.onprogress中的event參數

正所謂工欲善其事必先利其器,以上是XMLHttpRequest對象以及相關的基礎知識骡苞,有些很抽象垂蜗,有些介紹的也不是很全面,有些可能有還有一些問題(對于編程的學習理解:實踐是檢驗真理的唯一途徑解幽,但不是確定真理的方法贴见,任何通過實踐掌握的真理都需要辯證地對待。)躲株,但是了解掌握了以上兩篇的內容片部,才能更深刻的理解XMLHttpRequest對象,相對于原型徘溢,閉包吞琐,異步這些概念來說,我覺得XMLHttpRequest對象更加抽象然爆,因為沒有一定的后端基礎站粟,可能沒法更好的理解它的本質,下一篇文章會結合demo著重介紹一下XMLHttpRequest的用法曾雕,會涉及到canvas奴烙、拖拽(html5的api)、vue剖张、react切诀、nodejs的知識。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末搔弄,一起剝皮案震驚了整個濱河市幅虑,隨后出現的幾起案子,更是在濱河造成了極大的恐慌顾犹,老刑警劉巖倒庵,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異炫刷,居然都是意外死亡擎宝,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門浑玛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绍申,“玉大人,你說我怎么就攤上這事〖模” “怎么了胃碾?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涂屁。 經常有香客問我书在,道長,這世上最難降的妖魔是什么拆又? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任儒旬,我火速辦了婚禮,結果婚禮上帖族,老公的妹妹穿的比我還像新娘栈源。我一直安慰自己,他們只是感情好竖般,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布甚垦。 她就那樣靜靜地躺著,像睡著了一般涣雕。 火紅的嫁衣襯著肌膚如雪艰亮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天挣郭,我揣著相機與錄音迄埃,去河邊找鬼。 笑死兑障,一個胖子當著我的面吹牛侄非,可吹牛的內容都是我干的。 我是一名探鬼主播流译,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼逞怨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了福澡?” 一聲冷哼從身側響起叠赦,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎革砸,沒想到半個月后眯搭,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡业岁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了寇蚊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笔时。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仗岸,靈堂內的尸體忽然破棺而出允耿,到底是詐尸還是另有隱情借笙,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布较锡,位于F島的核電站业稼,受9級特大地震影響,放射性物質發(fā)生泄漏蚂蕴。R本人自食惡果不足惜低散,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骡楼。 院中可真熱鬧熔号,春花似錦、人聲如沸鸟整。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篮条。三九已至弟头,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涉茧,已是汗流浹背赴恨。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留降瞳,地道東北人嘱支。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像挣饥,于是被迫代替她去往敵國和親除师。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容

  • 第二講 什么是線性表 由同類型數據元素構成的有序序列結構扔枫。線性表可以用順序存儲結構汛聚,也可以使用鏈式存儲結構。鏈式結...
    滄海夢帆閱讀 307評論 0 0
  • 每年一到夏天就個聲音一直讓我去剪短發(fā)短荐,昨晚聽從內心的聲音倚舀,去把一頭長發(fā)給剪了。剪完有種一身輕松的感覺忍宋。 小屁...
    所謂荼靡閱讀 311評論 2 2
  • 被你藏在唇邊的語言 我就把它們寫出來 漂浮的空氣如五線譜 落地的花葉似音符 鳥是歌唱家 蒼穹大地就是舞臺 我是行走...
    龍青閱讀 438評論 1 11
  • 當我們 在github上fork出一個項目后痕貌,如何保持原項目和fork之后項目的代碼同步 同步原項目代碼 在for...
    Sraita閱讀 1,950評論 0 3