Web的文件處理


前言

瀏覽器如何處理文件,文件的上載與下載到底是怎么回事?
前端的各種處理方式

  • 傳統(tǒng)flash上傳
  • 新增iframe框ajax上載
  • 表單數(shù)據(jù)提交
  • HTML5的新工具——File API

我們下面依次講一下它們的原理寻狂,主要是后兩者和后端如何處理

flash上傳

沒有了解過访娶,不做評(píng)論

iframe框上傳

通過新建一個(gè)隱藏的iframe框拴清,把數(shù)據(jù)放到這個(gè)iframe框架里泻蚊,然后把它提交到服務(wù)器端處理躲舌,服務(wù)器返回的信息也是有iframe框調(diào)用父框架的方法處理丑婿⌒孕郏總之,是很坑爹的羹奉。

表單數(shù)據(jù)提交

重點(diǎn)有兩個(gè)秒旋,一個(gè)是FormData的數(shù)據(jù)對(duì)象,一個(gè)是level2 的XHttpRequest對(duì)象诀拭。

表單數(shù)據(jù)

var form= new FormData();
form.append(field,file,filename);
//field是表單里的key迁筛,就類似于一般表單里的name,file文件對(duì)象耕挨,filename是傳送至服務(wù)器里的文件名细卧,一般缺省

只要FormData里含有文件時(shí),上傳時(shí)enctype就是multipart/form-data而非一般時(shí)的application/x-www-form-urlencoded筒占,指定了不一樣的編碼類型贪庙。

XHttpRequest對(duì)象

創(chuàng)建xhr對(duì)象
if (typeof XMLHttpRequest !== 'undefined') {
       xhr = new XMLHttpRequest();
} else {
         var v = [
            "Microsoft.XmlHttp",
            "MSXML2.XmlHttp.5.0",
            "MSXML2.XmlHttp.4.0",
            "MSXML2.XmlHttp.3.0",
            "MSXML2.XmlHttp.2.0"
         ];
         for (var i=0; i < v.length; i++){
             try {
                  xhr = new ActiveXObject(v[i]);
                  break;
                 } catch (e){}
             }
         }
         return xhr;
xhr發(fā)起請(qǐng)求
xhr.open(option.method,option.action);
xhr.overridemimeType('..');//設(shè)定content-type
xhr.send(form);
xhr處理事件

可以把xhr對(duì)象當(dāng)原生js對(duì)象看待,其方法的調(diào)用都符合原生對(duì)象的習(xí)慣和規(guī)律

xhr.addEventlistener('progress',function(evt){
    if(evt.lengthComputable){
      var complete=evt.loaded/evt.total | 0;
    }
});
//progress事件在一次請(qǐng)求回話中定時(shí)觸發(fā)翰苫,常用做進(jìn)度條
//最重要的事件是readystatechange,xhr對(duì)象有0,1,2,3止邮,4五個(gè)狀態(tài)
//當(dāng)狀態(tài)為4的時(shí)候,回話結(jié)束奏窑,無論錯(cuò)誤還是獲得響應(yīng)
//狀態(tài)為4時(shí),status==200說明從服務(wù)器成功獲得響應(yīng)
xhr.onreadystatechange=function(evt){
    if(this.readystate!==4) return;
    if(this.state==200){success..}
    else fail;
};
xhr的重要變量
  • xhr.state
  • xhr.readystatechange
  • xhr.responseText导披,從服務(wù)器得到的響應(yīng),純文本格式埃唯,應(yīng)該進(jìn)一步解析

File API

瀏覽器的文件API只能讀本地文件而不能寫本地文件撩匕,其中最重要的是FileReader。

創(chuàng)建與讀取

var reader=new FileReader();
reader.readAsBinaryString(file);
reader.readAsText(file);
reader.readAsDataURL(file);
//DataURL是一種指向?yàn)g覽器緩存的base64編碼的字符串墨叛,可以用來預(yù)覽圖片

事件處理

其處理機(jī)制也是與原生js對(duì)象一致的

reader.onload//成功讀取
reader.onprogress//基本與前面的xhr的progress一致
reader.onloadend//無論是否成功止毕,結(jié)束使=時(shí)均會(huì)觸發(fā)
reader.onloadend=function(evt){
    if(reader.error) return error;
    return evt.target.result;
    //evt.target指向reader,用this.result也應(yīng)該可以
};

上傳操作

xhr將類型設(shè)置為二進(jìn)制流
xhr.send(reader.result);

但是我在node的后端沒有找到好的插件來解析req,導(dǎo)致雖然我驗(yàn)證了這種方式真的上傳了文件(大形∈怠)滓技,但沒有實(shí)現(xiàn)文件寫到服務(wù)器磁盤,我個(gè)人認(rèn)為這才是文件上傳未來的主要模式棚潦。

后端處理

req=請(qǐng)求頭+請(qǐng)求體
請(qǐng)求頭會(huì)被立即解析令漂,而請(qǐng)求體不會(huì)
請(qǐng)求體中不僅包含了文件的內(nèi)容,還有文件的信息,實(shí)際上文件是一個(gè)可讀流對(duì)象叠必,還有它的各種屬性荚孵,我們解析之后才能把文件與文件,文件內(nèi)容與文件信息區(qū)分開來
對(duì)于一般的文本編碼纬朝,只要這樣做就可以了

var post='';
req.on('data',function(chunk){
    post+=querystring.parse(chunk);
});

我們可以輕易地看到內(nèi)容
單對(duì)于二進(jìn)制數(shù)據(jù)就沒有這么簡(jiǎn)單了收叶,文件與文件之間是有特定的分隔符的,關(guān)于這一點(diǎn)共苛,cnode上有一篇文章講的很好判没,文章名是node-post文件上傳原理詳解,有興趣的可以閱讀隅茎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澄峰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辟犀,更是在濱河造成了極大的恐慌俏竞,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堂竟,死亡現(xiàn)場(chǎng)離奇詭異魂毁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)出嘹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門席楚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疚漆,你說我怎么就攤上這事酣胀〉缦妫” “怎么了卜范?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵借卧,是天一觀的道長徊哑。 經(jīng)常有香客問我兜粘,道長粗仓,這世上最難降的妖魔是什么丢习? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任顶掉,我火速辦了婚禮狡耻,結(jié)果婚禮上墩剖,老公的妹妹穿的比我還像新娘。我一直安慰自己夷狰,他們只是感情好岭皂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沼头,像睡著了一般爷绘。 火紅的嫁衣襯著肌膚如雪书劝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天土至,我揣著相機(jī)與錄音购对,去河邊找鬼。 笑死陶因,一個(gè)胖子當(dāng)著我的面吹牛骡苞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楷扬,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼解幽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了毅否?” 一聲冷哼從身側(cè)響起亚铁,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎螟加,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吞琐,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捆探,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了站粟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黍图。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奴烙,靈堂內(nèi)的尸體忽然破棺而出助被,到底是詐尸還是另有隱情,我是刑警寧澤切诀,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布揩环,位于F島的核電站,受9級(jí)特大地震影響幅虑,放射性物質(zhì)發(fā)生泄漏丰滑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一倒庵、第九天 我趴在偏房一處隱蔽的房頂上張望褒墨。 院中可真熱鬧,春花似錦擎宝、人聲如沸郁妈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽噩咪。三九已至锄奢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剧腻,已是汗流浹背拘央。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留书在,地道東北人灰伟。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像儒旬,于是被迫代替她去往敵國和親栏账。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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