【SpringMVC】fileupload 文件处理器HttpServletRequestFilterable cannot be cast to MultipartHttpServletReques

SpringMVC 文件上传时类型转换异常

错误信息:

严重: Servlet.service() for servlet [web-app] in context with path [/Maven4Web] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: org.sitemesh.webapp.contentfilter.HttpServletRequestFilterable cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest] with root cause
java.lang.ClassCastException: org.sitemesh.webapp.contentfilter.HttpServletRequestFilterable cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

报错代码:

private MultipartHttpServletRequest multipartRequest;

private void wrapMultipartRequest(HttpServletRequest request) {
	...
	multipartRequest = (MultipartHttpServletRequest) request;
	...
}

报错原因分析:

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
上传文件功能在执行上述代码时报错:“类型转换异常”

大多数情况下都是由于一个原因导致:那就是 " multipart/form-data " 的配置。
当然前提是 SpringMVC的配置,fileupload 组件的配置没有问题。

所以,需要考虑两个问题。
1、 form 表单 "enctype = ‘multipart/form-data’ " 是否配置并保存。
2、如果 form 表单中配置了该项,那么后台是否成功接收到这一配置信息。

如下:

1、确认 form 表单配置

<form id="form1" action="/form/savefile" enctype="multipart/form-data" method="post">
...
</form>

2、后台确认 request 是否成功接收到这一配置

MultipartResolver resolver =  new CommonsMultipartResolver(request.getSession().getServletContext());
boolean isMultipart = resolver.isMultipart(request);

img1

断点调试,可以发现,后台得到的 isMultipart 的值为 false。
也就是说,form 表单中虽然设置了 enctype=“multipart/form-data” ,但该设置并没有传递到后台。

所以,初步断定,问题出在 form 表单提交过程。

因为我这里使用的是 ajax 提交表单,所以debugger调试前台数据。

结果,发现一个很尴尬的问题…… ajax 请求中的参数 contentType 被我误写为 contenType。 导致 ajax 提交失败。

修改后,前台提交代码如下:

$.ajax({
    type : $form.attr('method') || 'POST',
    url : $form.attr('action'),
    data : data,
    cache : false,
    dataType : 'json',
    contentType : false,//发送数据到服务器所使用的内容类型。默认为 true,即文本URL类型。上传文件时,需要设置为 false,即form-data类型。
    processData : false,//请求发送的数据是否转换为查询字符串。默认为 true,即转换。上传文件时,设置为 false,不需要转换。
    success : function(json) {
     	console.info(json);
    },
    error:function(e){
     	console.error(e);
    }
});

再次 debug 后台,可以看到,isMultipart 的值变成了 true。

img2

继续调试,可以看到前端接收到的结果。
img3

此时。报错信息已经没有了。(灬°ω°灬) 虽然前端接收到的链接地址里面有个 null。但这并不是重点。 (灬°ω°灬)

总结:

HttpServletRequestFilterable cannot be cast to MultipartHttpServletReques
该报错 80% 的情况下是由于表单的 enctype=“multipart/form-data” 属性没有成功的传递到后台。
一般分为 3 步检查:
1、检查前台 form 表单配置
2、检查后台 isMultipart 的值,确认后台是否接收到这一配置
3、检查 form 表单的提交过程,确认提交过程中是否出错。这其中的出错原因可能会有很多种,包括链接、方法、数据等多方面的可能,当然也包括我这种单词写错的(尴尬…)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HolaSecurity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值