SpringMVC提交带文件上传的form表单报错怎么解决

思灵月 2016-12-07 04:31:55
项目中有用到 Spring Security

异常信息如下:
java.lang.ClassCastException: org.springframework.security.web.servletapi.HttpServlet3RequestFactory$Servlet3SecurityContextHolderAwareRequestWrapper cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest
at com.gionee.baserom.search.controller.AdInfoController.saveAdInfo(AdInfoController.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:747)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:676)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at com.gionee.baserom.search.security.GioneeSecurityFilter.invoke(GioneeSecurityFilter.java:74)
at com.gionee.baserom.search.security.GioneeSecurityFilter.doFilter(GioneeSecurityFilter.java:61)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205)
.......

我已经在SpringMVC中加入了multipartResolver
	
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="10485760000" />
<property name="maxInMemorySize" value="40960" />
</bean>


我的form是这样的,其他属性省略了:

<form enctype="multipart/form-data" method="post" action="adinfo/saveAdInfo?editType=${editType}&resKey=adInformation" class="pageForm required-validate">

<input name="adImage" type="file" />

</form>


我的controller方法:

@RequestMapping(value = "/saveAdInfo", method = RequestMethod.POST)
public void saveAdInfo(HttpServletRequest request,HttpServletResponse response,AdInfo ai,
String editType,String resKey) throws IllegalStateException, IOException{

//将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver( request.getSession().getServletContext());
if(multipartResolver.isMultipart(request)){
//将request变成多部分request
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//获取multiRequest 中所有的文件名
Iterator iter=multiRequest.getFileNames();

while(iter.hasNext()) {
//一次遍历所有文件
MultipartFile file=multiRequest.getFile(iter.next().toString());
if(file!=null) {
String path="F:\\pic\\test"+file.getOriginalFilename();
//上传
file.transferTo(new File(path));
}
}
}

ajaxObj = adInfoService.saveAdInfo(resKey,editType,ai);
jsonResult = JSONObject.toJSONString(ajaxObj);
StringHelper.outputJsonString(jsonResult, response);
}


在这一行报错了
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;


我已经加入了commons-fileupload、commons-io依赖:

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>


请各位帮我看看问题出在哪里?为什么不能转换?
这个问题折腾了我一天了,大家帮帮忙
...全文
555 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
思灵月 2016-12-09
  • 打赏
  • 举报
回复
controller的完整代码如下:
@RequestMapping(value = "/saveAdInfo", method = RequestMethod.POST)
	public void saveAdInfo(HttpServletRequest request,HttpServletResponse response,AdInfo ai,
			String editType,String resKey,@RequestParam("adImage") MultipartFile adImage) throws IllegalStateException, IOException{
		
		String fileName = adImage.getOriginalFilename();
		String[] ymd = StringHelper.getYMD().split("-");
		
		String path=request.getSession().getServletContext().getRealPath("");
		String imgPath = "/upload/" + ymd[0] + "/" + ymd[1] + "/" + ymd[2];
		ai.setAdImagePath(imgPath + "/" + fileName);
		
		File targetDir = new File(path + imgPath);
        if (!targetDir.exists()) {
            targetDir.mkdirs();
        }
        logger.info("广告图保存至目录:" + targetDir);
        
        try {
        	// 保存
        	adImage.transferTo( new File(targetDir +"/" + fileName));
//        	FileOutputStream out = new FileOutputStream(targetDir + "/" + fileName);
//        	out.write(adImage.getBytes());
//          out.flush();
//          out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
		
        String url = request.getParameter("url");
        String appName = request.getParameter("appName");
        AdBehaviorTodo abt = new AdBehaviorTodo();
        abt.setUrl(url);
        abt.setAppName(appName);
        
		ajaxObj = adInfoService.saveAdInfo(resKey,editType,ai,abt);
		jsonResult = JSONObject.toJSONString(ajaxObj);
		StringHelper.outputJsonString(jsonResult, response);
	}
思灵月 2016-12-09
  • 打赏
  • 举报
回复
没人回答....好在自己解决了! 其实配置是没错的,问题在于ajax无法提交multipart/form-data 表单,后来使用$('#adInfoForm').ajaxSubmit()解决了。
caoaran 2016-12-08
  • 打赏
  • 举报
回复
为什么能转换?骗的了编译器却骗不了虚拟机

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧