最近遇到一个极为头疼的事情:
使用jquery.form.js (version: 3.51.0)异步提交表单,上传文件,表单<form id="accountForm" action="xx" method="POST" enctype="multipart/form-data">...</form>
在google里面能够正常使用,但是测试ie8时,进入后台,文件上传成功,@responseBody 返回一个map时,ie8提示下载文件,并没有进入ajax回调函数。
经过文档查询,综合整理,多次尝试,终于解决了这个问题,记录下,大家共同进步。
注释掉<mvc:annotation-driven /> 。没有配置这个,就可以忽略当前步骤。
2.修改配置
使用jquery.form.js (version: 3.51.0)异步提交表单,上传文件,表单<form id="accountForm" action="xx" method="POST" enctype="multipart/form-data">...</form>
在google里面能够正常使用,但是测试ie8时,进入后台,文件上传成功,@responseBody 返回一个map时,ie8提示下载文件,并没有进入ajax回调函数。
遇到类同问题,请往下继续阅读。
解决步骤:(请各位仔细对比)
注释掉<mvc:annotation-driven /> 。没有配置这个,就可以忽略当前步骤。
2.修改配置
<bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!--防止ie8出现下载,mvc:annotation-driven注释掉,需要把text/json提到最前面,默认返回json,以免所有ajax设置dataType:json -->
<value>text/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
3.修改javascript
$("#Form").ajaxSubmit({
type : "POST",
dataType : $.isIE() ? "text" : "json",
success : function(data) {
if (typeof (data) == "string") {
//ie会进入这里
data = JSON.parse(data);//或者data = eval("(" + data + ")");
}
alert(data.status);
//后面的代码按各自逻辑来。
}
});
1.第三步使用ajaxSubmit依赖jquery.form.js,不同jquery.js $.ajax()不能实现异步上传文件。
2.第三步 $.isIE() 判断浏览器是否是IE浏览器,代码:
$.isIE = function(){
return !!window.ActiveXObject || "ActiveXObject" in window;
}
3.第三步回调中,使用了data = JSON.parse(data);,是因为,当代码在IE中运行,提交使用的是dataType:'text',即便后台返回的是json,但是这里回调得到的data依然是一个字符串,因此需要把data转为json。google中,回调得到的data已经是json,而非字符串,所以这里不会进入if(){}语句。
4.第二步中<value>text/json;charset=UTF-8</value>配置建议放最前面,否则,使用$.ajax,不配置dataType时,回调得到的是字符串。配置dataType:'json'回调得到的才是json。放最前面,则未配置dataType时,回调得到的依然是json
望各位同行通过我这篇总结,能解决遇到的这个问题。文字冗余,见谅!