兼容ie9圖片上傳终畅,解決ie9下提示下載或保存

如果不考慮ie9兼容性,實(shí)現(xiàn)【上傳圖片】大致的思路如下:

  1. 由于公司是將所有上傳的圖片都放到【代理服務(wù)器】里竟闪。所以【上傳圖片】其實(shí)是上傳到【代理服務(wù)器】离福。可以通過ajax炼蛤,通過FormData將圖片上傳到【代理服務(wù)器】妖爷。
  2. 從【代理服務(wù)器】拿到的回調(diào)里,有壓縮過的圖片的url,將這個(gè)url賦值給DOM里圖片img的src就行了絮识。由于我們的項(xiàng)目是用的vue绿聘,直接綁定:src就行了。
  3. 上傳圖片到【代理服務(wù)器】完成后次舌,需要將url等相關(guān)數(shù)據(jù)(我們的項(xiàng)目后端需要一個(gè)pid熄攘,來實(shí)現(xiàn)用戶下次訪問時(shí),后端從代理服務(wù)器根據(jù)這個(gè)pid來獲取相應(yīng)圖片】)彼念,通過ajax發(fā)給后端(我們公司的服務(wù)器)挪圾。

思路很簡單,而且核心關(guān)鍵其實(shí)就是第1點(diǎn)逐沙,第2哲思,3只是簡單的DOM操作和ajax交換數(shù)據(jù)。接下來就只關(guān)注第1點(diǎn)的具體實(shí)現(xiàn)吩案。

1. 通過formData棚赔,結(jié)合html5的input type=file來實(shí)現(xiàn)上傳

<input name="file" type="file" @change="update" accept="image/x-png, image/jpg, image/jpeg">

對應(yīng)的,Vue的methods里务热,update方法如下:

update(e) {

  let file = e.target.files[0]; //input提供的API忆嗜,如果需要過濾圖片尺寸,也可以在e.target.files[0]里拿到相應(yīng)數(shù)據(jù)崎岂。

  let param = new FormData(); //通過FormData來將圖片信息發(fā)送給服務(wù)器捆毫;FormData是html5的私有對象。

  param.append('file', file, file.name);

/* 接下來冲甘,就是通過ajax绩卤,發(fā)送form數(shù)據(jù)到服務(wù)器,我們公司用的jQuery江醇,比較普遍的應(yīng)該是axios吧 */

  $.ajax({

    url: '/image/upload',

    type: 'POST',

    data: param, //保證data格式為FormData

    processData: false, //必須false才會自動加上正確的Content-Type

    contentType: false //必須false才會避開jQuery對 formdata 的默認(rèn)處理

  }).done(function(res) {

  // 回調(diào)

  })

}

然后濒憋,在回調(diào)里,給DOM里的圖片src賦值就行了陶夜。

當(dāng)然凛驮,如果不兼容ie9,現(xiàn)在這個(gè)方案就行了条辟。

在ie9下黔夭,不支持FormData。所以在ie9下羽嫡,只能通過form表單形式實(shí)現(xiàn)圖片上傳本姥。

2. ie9下通過form表單實(shí)現(xiàn)圖片上傳

<form id="myForm" method="post" action="/image/ieupload" enctype="multipart/form-data">

  <input name="file" type="file" @change="update" accept="image/x-png, image/jpg, image/jpeg">

  <input id="submit" type="submit" style="display:none">

</form>

form里,enctype必須為mulitpart/form-data杭棵,表單中enctype="multipart/form-data"的意思婚惫,是設(shè)置表單的MIME編碼。默認(rèn)情況,這個(gè)編碼格式是application/x-www-form-urlencoded先舷,不能用于文件上傳艰管;只有使用了multipart/form- data,才能完整的傳遞文件數(shù)據(jù)蒋川。

同時(shí)要加上input type="submit"蛙婴,只有點(diǎn)擊(或者trigger click)這個(gè)按鈕,才會將數(shù)據(jù)發(fā)送到服務(wù)器尔破。

這樣街图,在上面的update方法里,就需要加一層判斷懒构,如果不是ie9(或者是瀏覽器不支持formData)餐济,就通過formData結(jié)合ajax實(shí)現(xiàn)上傳圖片。通過formData的好處是不用在DOM里寫form胆剧,(form表單提交絮姆,一般的服務(wù)器處理方式是重定向),只通過ajax跟后端服務(wù)器交換數(shù)據(jù)可以讓接口更加統(tǒng)一秩霍。而如果是ie9篙悯,則必須要通過form表單提交,在update方法里铃绒,通過trigger #submit元素的click事件來完成表單提交鸽照。

但是,如果服務(wù)器返回的是json颠悬,并不能拿到服務(wù)器返回的數(shù)據(jù)矮燎,而是直接提示下載或打開

ie9下,不能拿到回調(diào)

之所以ie9下提示打開或者保持赔癌,是因?yàn)椋?br> ie無法解析回調(diào)里的json數(shù)據(jù)诞外,就是說如果服務(wù)器返回json數(shù)據(jù),ie會把它當(dāng)做文件來處理灾票,顯示打開或保存峡谊。

解決方法如下:
在后端返回的時(shí)候自定義contype-type為"text/html",比如在node中這樣寫res.setHeader('Content-Type', 'text/html')刊苍。
參考資料:文件上傳返回JSON數(shù)據(jù)既们,在IE下提示下載文件

這樣改完之后,會發(fā)現(xiàn)班缰,雖然現(xiàn)在不提示下載文件了贤壁,可是會直接跳轉(zhuǎn)到新頁面悼枢。

ie9下會直接跳轉(zhuǎn)

在ajax未誕生前埠忘,都是用iframe來實(shí)現(xiàn)無刷新的效果。為了避免跳轉(zhuǎn)到新頁面,需要手動指定跳轉(zhuǎn)的頁面為一個(gè)iframe莹妒。然后取到iframe里的回調(diào)內(nèi)容后名船,將相應(yīng)內(nèi)容從iframe里取出來使用。

參考資料:通過iframe防止form表單提交時(shí)跳轉(zhuǎn)頁面

另外旨怠,由于因?yàn)閒ile是Readonly渠驼,如果用戶上傳的圖片不符合要求,想清空value鉴腻,只能用新的file替換之前的file迷扇。
參考資料:http://www.cnblogs.com/nsky/archive/2012/12/28/2836578.html

3. 拓展:本地預(yù)覽(fileReader)

fileReader就是html5為我們提供的讀取文件的api。它的作用就是把文本流按指定格式讀取到緩存爽哎,以供js調(diào)用蜓席。
參考資料:上傳圖片本地預(yù)覽
通過fileReader的readAsDataURL方法,將文件讀取為 DataURL课锌,然后賦值給img的src厨内,就大功告成啦。
DataURL有其固定的格式渺贤,如下:
data:[文件格式];base64,[文本流base64編碼]雏胃。

img src的值為DataURL格式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市志鞍,隨后出現(xiàn)的幾起案子瞭亮,更是在濱河造成了極大的恐慌,老刑警劉巖固棚,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件街州,死亡現(xiàn)場離奇詭異,居然都是意外死亡玻孟,警方通過查閱死者的電腦和手機(jī)唆缴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黍翎,“玉大人面徽,你說我怎么就攤上這事∠坏В” “怎么了趟紊?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碰酝。 經(jīng)常有香客問我霎匈,道長,這世上最難降的妖魔是什么送爸? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任铛嘱,我火速辦了婚禮暖释,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘墨吓。我一直安慰自己球匕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布帖烘。 她就那樣靜靜地躺著亮曹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秘症。 梳的紋絲不亂的頭發(fā)上照卦,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音乡摹,去河邊找鬼窄瘟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛趟卸,可吹牛的內(nèi)容都是我干的蹄葱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锄列,長吁一口氣:“原來是場噩夢啊……” “哼图云!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邻邮,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤竣况,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后筒严,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丹泉,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年鸭蛙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摹恨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迫筑。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡江咳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出襟企,到底是詐尸還是另有隱情肪获,我是刑警寧澤寝凌,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站孝赫,受9級特大地震影響较木,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜青柄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一伐债、第九天 我趴在偏房一處隱蔽的房頂上張望预侯。 院中可真熱鬧,春花似錦泳赋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拣技,卻和暖如春千诬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膏斤。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工徐绑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莫辨。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓傲茄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沮榜。 傳聞我的和親對象是個(gè)殘疾皇子盘榨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • 上傳文件已經(jīng)是個(gè)已經(jīng)成熟的前端技術(shù),目前開源的拿來即用的前端上傳插件也比較多蟆融,諸如:Web Uploader草巡、JS...
    清曉凝露閱讀 11,415評論 0 22
  • 最近項(xiàng)目需要使用 Angular,對于初學(xué) Angular 的我只能硬著頭皮上了型酥,項(xiàng)目中有一個(gè)需求是文件上傳山憨,磕磕...
    雖萬萬人吾往矣閱讀 18,271評論 3 20
  • 背景描述 有這么一個(gè)需求:一個(gè)表單,有十幾個(gè)input弥喉,一個(gè)文件上傳的input郁竟,可以上傳一張圖片。 要求上傳圖片...
    Java_or_PHP閱讀 4,541評論 0 5
  • 本文詳細(xì)介紹了 XMLHttpRequest 相關(guān)知識由境,涉及內(nèi)容: AJAX枪孩、XMLHTTP、XMLHttpReq...
    semlinker閱讀 13,660評論 2 18
  • 切換到~目錄(windows切換到 C 盤) 在當(dāng)前目錄下創(chuàng)建文件夾 projects 切換到 projects ...
    Eazer閱讀 178評論 0 0