如上代码,在IE8下,上传成功后返回json,会自动弹出下载文件框,变成作为流文件提示下载。
原因:返回的 ContentType 和 请求的 Accept 不一致!
先看jquery form插件ajax上传文件的原理:
1、浏览器实现了XMLHttpRequest level2规范的,则插件使用xhr直接提交文件。通常来说chrome、firefox都实现了xhr level2规范
2、浏览器只实现了XMLHttpRequest level1规范的,则插件使用form+iframe方式,实现页面无刷新上传文件。通常来说,IE8及以下都属于此列。
IE8 下,此 js 插件提交时:Accept:text/html, application/xhtml+xml, */*
其它浏览器中则是:Accept:application/json, text/javascript, */*; q=0.01
Accept 与 response 则就不对应一致了,就会出现下载提示。
基于iframe上传文件,对于返回json对象,如果把响应头的content-type设为"application/json",在ie中会弹出下载文件的提示框。解决这个问题的方式是把响应头的content-type的值设为"text/plain"或者"text/html"。
解决方案:
1. 后台返回json串,而不是json对象,如 return Json(new { state = 1, msg = "" });改为return Content(" {state:1,msg:''}"); 前台ajax接收类型datatype:由json改为text。成功后接收的data转成json对象即可使用: vardata = eval("(" + data1 + ")");
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 不一致。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。