1. 需求: 通过 ajax 请求上传文件, 到 controller处理完后, 返回一个封装了结果信息的 VO
2. 所踩的坑: 可以正常访问 controller, 正常处理完成后 return vo; 看了浏览器 firebug 的 network 访问记录, response状态是406
以下是代码:
JS:
// 文件上传
function uploadExcel() {
// 文件上传
var filename = $("#excelFile").val();
if (filename) {
var reg_csv = /[^\.](\.csv)$/i;
if (reg_csv.test(filename)) {
$(this).attr('disabled', true);
$("#uploadExcel").attr('disabled', true);
$("#uploadExcel").attr('class', 'btn gray');
var formData = new FormData();
formData.append("excelFile", $("#excelFile")[0].files[0]);
$.ajax({
url : "fileAddGive.htm",
type : "POST",
data : formData,
processData : false,
contentType : false,
success : function(responseStr) {
if (responseStr.code == "0001")
{
$.dopAlert(responseStr.msg);
} else if (responseStr.failList
&& responseStr.failList.length > 0) {
$.dopAlert("文件导入完成,失败[" + responseStr.failList + "]");
}
},
error : function(responseStr) {
$.dopAlert("导入失败:未知异常");
}
});
searchAll.fnDraw();
} else {
$.dopAlert('格式不正确,只支持 .csv 类型文件');
// 启用按钮,清空文件选择框内容
$("#btn-delete-promotionFile").click();
$("#uploadExcel").attr('disabled', false);
$("#uploadExcel").attr('class', 'btn blue');
}
} else {
$.dopAlert('没有找到你需要上传的文件');
}
}
以下是 controller:
/**
* 文件导入新增充值数据
*/
@RequestMapping(value = "/fileAddGive",produces="application/json")
@ResponseBody
public ReqResultVo fileAddGive(@RequestParam("excelFile") MultipartFile excelFile) {
ReqResultVo resultVo = new ReqResultVo();
省略代码逻辑
return resultVo;
}
以下是 web.xml 的 springmvc 的配置
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/spring/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>*.htm</url-pattern>
<url-pattern>*.json</url-pattern>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
百度了很久,尝试了很多种解决方法,如常见的在 pom 中加 jackson 的依赖,在 springmvc 的注解开启中加 json 的支持,这两种方式能正常访问 controller ,但是没有解决问题.
在@ requestMapping注解上加 produces="application/json" ,这样导致在进入方法之前就报错406
解决方法:
最终尝试把ajax的访问路径url 以 .json结尾,竟然返回成功200,很是不懂,
猜测可能是因为url加上后缀 htm 后, springmvc 会默认把response 的 contentType 设置为text/html