jquery.form.js,文件上傳後返回JSON數據,在IE下提示下載文件(ie8,9)

image.png
如上代碼,在IE8下,上傳成功後返回json,會自動彈出下載文件框,變成做爲流文件提示下載。javascript

緣由:返回的 ContentType 和 請求的  Accept 不一致!html

先看jquery form插件ajax上傳文件的原理:
一、瀏覽器實現了XMLHttpRequest level2規範的,則插件使用xhr直接提交文件。一般來講chrome、firefox都實現了xhr level2規範
二、瀏覽器只實現了XMLHttpRequest level1規範的,則插件使用form+iframe方式,實現頁面無刷新上傳文件。一般來講,IE8及如下都屬於此列。java

IE8 下,此 js 插件提交時:Accept:text/html, application/xhtml+xml, */*
其它瀏覽器中則是:Accept:application/json, text/javascript, */*; q=0.01
Accept 與 response 則就不對應一致了,就會出現下載提示。jquery

基於iframe上傳文件,對於返回json對象,若是把響應頭的content-type設爲"application/json",在ie中會彈出下載文件的提示框。解決這個問題的方式是把響應頭的content-type的值設爲"text/plain"或者"text/html"。ajax

解決方案:chrome

1.    後臺返回json串,而不是json對象,如 return Json(new { state = 1, msg = "" });改成return Content("       {state:1,msg:''}"); 前臺ajax接收類型datatype:由json改成text。成功後接收的data轉成json對象便可使用:              vardata = eval("(" + data1 + ")");json

2.    後臺依然返回json對象, returnJson(new { state = 1, msg = "" },"text/html");後端

131854_Lf71_176115.jpg
3.    發起ajax時並無顯示寫dataType的值,不是iframe請求。故而致使此類請求的 Accept  是 */* ,由於把返回值當作json處理的,若是後端響應頭 response.ContentType 不指定爲 json,則會致使 success 後返回的數據,js解析失敗報錯。調用了本方法返回json時,若是 Accept  是 */*,則將  response.ContentType 指定爲json頭。若是 Accept  已經有了值,則  response.ContentType 不指定任何值,以防和 Accept  不一致。瀏覽器

相關文章
相關標籤/搜索