image.png
如上代码,在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");

131854_Lf71_176115.jpg
3.    发起ajax时并没有显示写dataType的值,不是iframe请求。故而导致此类请求的 Accept  是 */* ,因为把返回值当做json处理的,如果后端响应头 response.ContentType 不指定为 json,则会导致 success 后返回的数据,js解析失败报错。调用了本方法返回json时,如果 Accept  是 */*,则将  response.ContentType 指定为json头。如果 Accept  已经有了值,则  response.ContentType 不指定任何值,以防和 Accept  不一致。


soso辉
84 声望2 粉丝

引用和评论

0 条评论