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