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