使用jquery Ajax實(shí)現(xiàn)上傳附件功能
用過(guò)jquery的Ajax的人肯定都知道,Ajax的默認(rèn)編碼方式是”application/x-www-form-urlencoded“,此編碼方式只能編碼文本類型的數(shù)據(jù),因此Ajax發(fā)送請(qǐng)求的時(shí)候,會(huì)把data序列化成 一個(gè)個(gè)String類型的鍵值對(duì),此種傳輸數(shù)據(jù)的方式能夠滿足大部分應(yīng)用場(chǎng)景,然而當(dāng)傳輸?shù)臄?shù)據(jù)里有附件的時(shí)候,此序列化機(jī)制便是我們的絆腳石。Ajax本身的序列化機(jī)制的硬傷歸其原因在于在html4的時(shí)代,沒(méi)有FileReader接口,在頁(yè)面里無(wú)法讀取File(Blob)文件,用document.getElementById("文件控件的id").value只能拿到文件的name,因此去序列化去編碼它也無(wú)從談起(個(gè)人觀點(diǎn),有不同意見(jiàn)的歡迎給我留言)。
眾所周知,用form提交表單的時(shí)候,有附件的時(shí)候,只要設(shè)置form的enctype="multipart/form-data",便可以上傳附件。于是博主想到,若是能用Ajax提交一個(gè)form,那上傳附件豈不是變的簡(jiǎn)單,再也不需要使用類似AjaxFileUpload之類的插件來(lái)作上傳。html5讓這一切便的簡(jiǎn)單。
FormData是html5的接口,使用它一行代碼便可以拿到整個(gè)form表單對(duì)象:
var form = new FormData(document.getElementById("form"));
然后我們拿著這個(gè)form對(duì)象,去賦給Ajax的data,并且阻止它將參數(shù)轉(zhuǎn)成成String類型的鍵值對(duì),此舉需要設(shè)置processData屬性為false,此屬性默認(rèn)為true;同時(shí)設(shè)置Ajax的編碼方式為false(contentType: false),在form表單里已經(jīng)設(shè)置了編碼方式,Ajax的編碼機(jī)制已經(jīng)不需要,這樣我們就可以用Ajax去提交一個(gè)form對(duì)象,從而解決表單有附件的問(wèn)題。需要注意的是,務(wù)必將Ajax的提交方式,設(shè)置為post,get請(qǐng)求只能攜帶幾kb的數(shù)據(jù)。若是不設(shè)置processData為false,去提交帶附件的form同樣是提交不上去的,它的序列化機(jī)制是硬傷。所以提交的時(shí)候,只能不使用它的序列化機(jī)制。
一言以蔽之:借Ajax的殼,去提交form。
示例如下:
<!DOCTYPE html> <html> <head> <script src="js/jquery-1.9.1.min.js"></script> <meta charset="utf-8" /> <title>Ajax提交form</title> <script type="text/javascript"> function test(){ var form = new FormData(document.getElementById("form")); $.ajax({ url:"接口地址", type:"post", data:form, cache: false, processData: false, contentType: false, success:function(data){ alert("操作成功!"); }, error:function(e){ alert("網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)重試??!"); } }); } </script> </head> <body> <form id="form" enctype="multipart/form-data"> <input type="text" id="name" name="name" /> <input type="text" id="phone" name="phone" /> <input type="text" id="content" name="content" /> <input type="text" id="price" name="price" /> <input type="text" id="ifPhone" name="ifPhone" /> <input type="text" id="ifCerName" name="ifCerName" /> <input type="text" id="endTime" name="endTime" /> <input type="text" id="type" name="type" /> <input type="file" id="fileAttach" name="fileAttach" /> <input type="button" onclick="test()" value="上傳" /> </form> </body> </html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Jquery的Ajax技術(shù)使用方法
- JQuery實(shí)現(xiàn)ajax請(qǐng)求的示例和注意事項(xiàng)
- JQuery Ajax執(zhí)行跨域請(qǐng)求數(shù)據(jù)的解決方案
- PHP ajax+jQuery 實(shí)現(xiàn)批量刪除功能實(shí)例代碼小結(jié)
- jQuery Ajax實(shí)現(xiàn)Select多級(jí)關(guān)聯(lián)動(dòng)態(tài)綁定數(shù)據(jù)的實(shí)例代碼
- 為jquery的ajax請(qǐng)求添加超時(shí)timeout時(shí)間的操作方法
- jQuery的Ajax接收java返回?cái)?shù)據(jù)方法
- jQuery AJAX 方法success()后臺(tái)傳來(lái)的4種數(shù)據(jù)詳解
- jquery 通過(guò)ajax請(qǐng)求獲取后臺(tái)數(shù)據(jù)顯示在表格上的方法
- AJAX在JQuery中的應(yīng)用詳解
相關(guān)文章
基于jquery實(shí)現(xiàn)漂亮的動(dòng)態(tài)信息提示效果
這個(gè)效果是在頁(yè)面頭部出現(xiàn)的,出現(xiàn)一下會(huì)自動(dòng)隱藏,上面有x那個(gè)提示就要手動(dòng)關(guān)閉一下,其他的都是自動(dòng)隱藏的!2011-08-08Bootstrap中點(diǎn)擊按鈕后變灰并顯示加載中實(shí)例代碼
Bootstrap插件非常的好用了,今天小編通過(guò)本教程給大家介紹Bootstrap中點(diǎn)擊按鈕后變灰并顯示加載中實(shí)例代碼,非常不錯(cuò),感興趣的朋友一起看看吧2016-09-09牛叉的Jquery——Jquery與DOM對(duì)象的互相轉(zhuǎn)換及DOM的三種操作
Jquery對(duì)象就是通過(guò)jQuery包裝DOM對(duì)象后產(chǎn)生的對(duì)象,jQuery對(duì)象是jQuery獨(dú)有的,其可以使用jQuery里的方法,本文給大家介紹Jquery對(duì)象就是通過(guò)jQuery包裝DOM對(duì)象后產(chǎn)生的對(duì)象,jQuery對(duì)象是jQuery獨(dú)有的,其可以使用jQuery里的方法。感興趣的朋友可以參考下2015-10-10jQuery焦點(diǎn)圖切換特效插件封裝實(shí)例
這篇文章介紹了jQuery焦點(diǎn)圖切換特效插件封裝實(shí)例,有需要的朋友可以參考一下2013-08-08JQuery實(shí)現(xiàn)動(dòng)態(tài)適時(shí)改變字體顏色的方法
這篇文章主要介紹了JQuery實(shí)現(xiàn)動(dòng)態(tài)適時(shí)改變字體顏色的方法,實(shí)例分析了jQuery操作鼠標(biāo)事件及顏色的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03使用jquery實(shí)現(xiàn)div的tab切換實(shí)例代碼
以前使用js代碼來(lái)寫(xiě)的簡(jiǎn)單效果現(xiàn)在用jQ來(lái)寫(xiě),具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-05-05jQuery插件slick實(shí)現(xiàn)響應(yīng)式移動(dòng)端幻燈片圖片切換特效
jQuery插件slick是一款響應(yīng)式、適用于移動(dòng)設(shè)備觸摸屏、可滑動(dòng)顯示的jQuery幻燈片插件。該幻燈片插件可以設(shè)置多種顯示效果,可以自動(dòng)播放,是一款移動(dòng)優(yōu)先的jQuery幻燈片插件。2015-04-04JQuery 1.6發(fā)布 性能提升,同時(shí)包含大量破壞性變更
JQuery 1.6剛剛發(fā)布了,有幾處性能和跨瀏覽器兼容性的改進(jìn),專門(mén)重寫(xiě)了屬性模塊2011-05-05