Jquery Ajax請(qǐng)求文件下載操作失敗的原因分析及解決辦法
jQuery確實(shí)是一個(gè)挺好的輕量級(jí)的JS框架,能幫助我們快速的開發(fā)JS應(yīng)用,并在一定程度上改變了我們寫JavaScript代碼的習(xí)慣。
廢話少說,直接進(jìn)入正題,我們先來分析一下失敗的原因
一、失敗的原因
那是因?yàn)閞esponse原因,一般請(qǐng)求瀏覽器是會(huì)處理服務(wù)器輸出的response,例如生成png、文件下載等,然而ajax請(qǐng)求只是個(gè)“字符型”的請(qǐng)求,即請(qǐng)求的內(nèi)容是以文本類型存放的。文件的下載是以二進(jìn)制形式進(jìn)行的,雖然可以讀取到返回的response,但只是讀取而已,是無法執(zhí)行的,說白點(diǎn)就是js無法調(diào)用到瀏覽器的下載處理機(jī)制和程序。
二、解決方案
1)可以使用jquery創(chuàng)建表單并提交實(shí)現(xiàn)文件下載;
var form = $("<form>"); form.attr("style","display:none"); form.attr("target",""); form.attr("method","post"); form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do"); var input1 = $("<input>"); input1.attr("type","hidden"); input1.attr("name","strZipPath"); input1.attr("value",strZipPath); $("body").append(form); form.append(input1); form.submit(); form.remove();
2)可以直接使用a標(biāo)簽實(shí)現(xiàn)文件下載;
<a href=”下載地址”>點(diǎn)擊下載</a>
3)使用隱藏iframe或新窗體解決。
PS:AJAX請(qǐng)求 $.ajax方法的使用
使用jQuery的$.ajax方法可以更為詳細(xì)的控制AJAX請(qǐng)求。它在AJAX請(qǐng)求上施加細(xì)粒度級(jí)別的控制。
$.ajax方法語(yǔ)法
$.ajax(options) |
|
參數(shù) |
|
options |
(對(duì)象)一個(gè)對(duì)象的實(shí)例,其屬性定義這個(gè)操作的參數(shù)。詳情見下表。 |
返回值 |
XHR實(shí)例 |
options詳細(xì)范圍值
名稱 |
類型 |
描述 |
url |
字符串 |
請(qǐng)求的url地址 |
type |
字符串 |
將要使用的HTTP方法。通常是POST或GET。如果省略,則默認(rèn)為GET |
data |
對(duì)象 |
一個(gè)對(duì)象,其屬性作為查詢參數(shù)而傳遞請(qǐng)求。如果是GET請(qǐng)求,則把數(shù)據(jù)作為查詢字符串傳遞;如果是POST請(qǐng)求,則把數(shù)據(jù)作為請(qǐng)求體傳遞。在這兩種情況下,都是由$.ajax()實(shí)用工具函數(shù)來處理值的編碼 |
dataType |
字符串 |
一個(gè)關(guān)鍵字,用來標(biāo)識(shí)預(yù)期將被響應(yīng)所返回的數(shù)據(jù)的類型。這個(gè)值決定再把數(shù)據(jù)傳遞給回調(diào)函數(shù)之前(如果有)進(jìn)行什么后續(xù)處理。有效值如下: xml-響應(yīng)文本被解析為XML文檔,而作為結(jié)果的XML DOM被傳遞給回調(diào)函數(shù) html-響應(yīng)文本未經(jīng)處理就被傳遞給回調(diào)函數(shù)。在已返回HTML片段內(nèi)的任何<script>塊將被求值 json-響應(yīng)文本被求值為JSON字符串,而作為結(jié)果的對(duì)象被傳遞給回調(diào)函數(shù) jsonp-與json相似,不同之處是提供遠(yuǎn)程腳本支持(假定遠(yuǎn)程服務(wù)器支持) script-響應(yīng)文本被傳遞給回調(diào)函數(shù)。在任何回調(diào)函數(shù)被調(diào)用之前,響應(yīng)被作為一個(gè)或多個(gè)JavaScript語(yǔ)句而進(jìn)行處理 text-響應(yīng)文本被假定為普通文本。服務(wù)器資源負(fù)責(zé)設(shè)置適當(dāng)?shù)膬?nèi)容類型響應(yīng)標(biāo)頭。如果省略這個(gè)屬性,則不對(duì)響應(yīng)文本進(jìn)行任何處理或求值就傳遞給回調(diào)函數(shù) |
timeout |
數(shù)值 |
設(shè)置Ajax請(qǐng)求的超時(shí)值(毫秒)。如果請(qǐng)求在超時(shí)值到期之前仍未完成,則中止請(qǐng)求并且調(diào)用錯(cuò)誤回調(diào)函數(shù)(如果已定義) |
global |
布爾型 |
啟用或禁用全局函數(shù)的觸發(fā)。這些函數(shù)可以附加到元素上,并且在Ajax調(diào)用的不同時(shí)刻或狀態(tài)下觸發(fā)。默認(rèn)啟用全局函數(shù)觸發(fā) |
contentType |
字符串 |
將要在請(qǐng)求上指定的內(nèi)容類型。默認(rèn)為application/x-www-form-urlencoded(與表單提交所使用的默認(rèn)類型相同) |
success |
函數(shù) |
如果請(qǐng)求的響應(yīng)指示成功狀態(tài)碼,則這個(gè)函數(shù)被調(diào)用。響應(yīng)體作為第一個(gè)參數(shù)被返回給這個(gè)函數(shù),并且根據(jù)指定的dataType屬性進(jìn)行。第二個(gè)參數(shù)是包含狀態(tài)碼的字符串—這種情況下永遠(yuǎn)為成功狀態(tài)碼 |
error |
函數(shù) |
如果請(qǐng)求的響應(yīng)返回錯(cuò)誤狀態(tài)碼,則這個(gè)函數(shù)被調(diào)用。三個(gè)實(shí)參被傳遞給這個(gè)函數(shù):XHR實(shí)例、狀態(tài)消息字符串(在這種情況下永遠(yuǎn)為錯(cuò)誤狀態(tài)碼)以及XHR實(shí)例所返回的異常對(duì)象(可選) |
complete |
函數(shù) |
請(qǐng)求完成時(shí)被調(diào)用。兩個(gè)實(shí)參被傳遞:XHR實(shí)例和狀態(tài)消息字符串(成功狀態(tài)碼或錯(cuò)誤狀態(tài)碼)。如果也指定了success或error回調(diào)函數(shù),則這個(gè)函數(shù)在success或error回調(diào)函數(shù)調(diào)用之后被調(diào)用 |
beforeSend |
函數(shù) |
在發(fā)起請(qǐng)求之前被調(diào)用。這個(gè)函數(shù)被傳遞XHR實(shí)例,并且可以用來設(shè)置自定義的標(biāo)頭或執(zhí)行其他預(yù)請(qǐng)求操作 |
async |
布爾型 |
如果指定為false,則請(qǐng)求被提交為同步請(qǐng)求。在默認(rèn)的情況下,請(qǐng)求是異步的 |
processData |
布爾型 |
如果設(shè)置為false,則阻止已傳遞數(shù)據(jù)被加工為URL編碼格式。默認(rèn)情況下,數(shù)據(jù)被加工為URL編碼格式(適用于類型為application/x-www-form-urlencoded的請(qǐng)求) |
ifModified |
布爾型 |
如果設(shè)置為true,則自從上一次請(qǐng)求以來,只有在響應(yīng)內(nèi)容沒有改變的情況下(根據(jù)Last-Modified標(biāo)頭)才允許請(qǐng)求成功。如果省略,則不執(zhí)行標(biāo)頭檢查 |
下面看個(gè)例子,盡可能多的用到options中的選項(xiàng)
客戶端代碼:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript"> $().ready(function () { $('#selectNum').change(function () { var idValue = $(this).val(); var show = $('#show'); $.ajax({ url: 'Server.aspx', type: 'POST', data: { id: idValue }, //調(diào)小超時(shí)時(shí)間會(huì)引起異常 timeout: 3000, //請(qǐng)求成功后觸發(fā) success: function (data) { show.append('success invoke!' + data+'<br/>'); }, //請(qǐng)求失敗遇到異常觸發(fā) error: function (xhr, errorInfo, ex) { show.append('error invoke!errorInfo:' + errorInfo+'<br/>'); }, //完成請(qǐng)求后觸發(fā)。即在success或error觸發(fā)后觸發(fā) complete: function (xhr, status) { show.append('complete invoke! status:' + status+'<br/>'); }, //發(fā)送請(qǐng)求前觸發(fā) beforeSend: function (xhr) { //可以設(shè)置自定義標(biāo)頭 xhr.setRequestHeader('Content-Type', 'application/xml;charset=utf-8'); show.append('beforeSend invoke!' +'<br/>'); }, //是否使用異步發(fā)送 async: true }) }); }) </script> </head> <body> <select id="selectNum"> <option value="0">--Select--</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select> <div id="show"></div> </body> </html>
服務(wù)端主要代碼:
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { if (Request["id"] != null && !string.IsNullOrEmpty(Request["id"].ToString())) { //啟用該句會(huì)引發(fā)ajax超時(shí)異常 // System.Threading.Thread.Sleep(3000); Response.Write(GetData(Request["id"].ToString())); } } } protected string GetData(string id) { string str = string.Empty; switch (id) { case "1": str += "This is Number 1"; break; case "2": str += "This is Number 2"; break; case "3": str += "This is Number 3"; break; default: str += "Warning Other Number!"; break; } return str; }
運(yùn)行程序,結(jié)果如圖:
相關(guān)文章
使用Ajax局部更新Razor頁(yè)面的實(shí)例代碼
Razor功能非常強(qiáng)大,但是本身并不能做到無刷新,所以需要配合ajax使用。本文通過一個(gè)例子給大家介紹使用Ajax局部更新Razor頁(yè)面,需要的朋友參考下吧2017-09-09ajax異步實(shí)現(xiàn)文件分片上傳實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于ajax異步實(shí)現(xiàn)文件分片上傳的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11AJAX實(shí)現(xiàn)仿Google Suggest效果
AJAX實(shí)現(xiàn)仿Google Suggest效果...2007-07-07使用ajax實(shí)現(xiàn)分頁(yè)技術(shù)
這篇文章主要為大家詳細(xì)介紹了如何使用ajax實(shí)現(xiàn)分頁(yè)技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02健壯的AJAX源碼學(xué)習(xí)應(yīng)用示例
健壯的AJAX源碼學(xué)習(xí)應(yīng)用示例...2006-09-09JQuery Ajax動(dòng)態(tài)生成Table表格
實(shí)現(xiàn)過程是這樣的:前臺(tái)通過jquery的ajax調(diào)用一般處理程序(Handler),獲取表格需要顯示的信息,然后轉(zhuǎn)換成json格式返回給前臺(tái),前臺(tái)獲取到數(shù)據(jù)后循環(huán)構(gòu)建表格的行,最好把行附加到表里。感興趣的朋友一起看看吧2015-09-09AJAX 動(dòng)態(tài)加載后臺(tái)數(shù)據(jù) 綁定select的方法
今天小編就為大家分享一篇AJAX 動(dòng)態(tài)加載后臺(tái)數(shù)據(jù) 綁定select的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08