Spring 2.5 多文件上传
2014-03-25 11:28
197 查看
项目中遇到一个问题:需要一个html5的上传控件来实现多文件上传,经测试在structs2框架下测试通过,但是在spring2.5框架下仅仅单文件测试通过,多文件上传(就是给input加上了multiple属性)报出异常。异常如下:
org.springframework.web.multipart.MultipartException:Multiplefilesforfieldname[files]found-notsupportedbyMultipartResolver org.springframework.web.multipart.commons.CommonsFileUploadSupport.parseFileItems(CommonsFileUploadSupport.java:254) org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:166) org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:149) org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1015) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:851) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 说明控件本身没什么问题,一定是spring2.5的问题!google了一下,果然是spring2.5陈年老bug! 见https://jira.spring.io/browse/SPR-2784 造成这样的异常的代码:
CommonsMultipartFilefile=newCommonsMultipartFile(fileItem); if(multipartFiles.put(file.getName(),file)!=null){ thrownewMultipartException( "Multiplefilesforfieldname["+file.getName()+"]found-notsupportedbyMultipartResolver"); } 解决方案有很多,这篇文章先介绍一种。由于CommonsMultipartResolver不是final的,所以可以继承并改写他的逻辑。
packageresolver; importjava.io.UnsupportedEncodingException; importjava.util.HashMap; importjava.util.Iterator; importjava.util.List; importjava.util.Map; importjavax.servlet.ServletContext; importorg.apache.commons.fileupload.FileItem; importorg.springframework.util.StringUtils; importorg.springframework.web.multipart.MultipartException; importorg.springframework.web.multipart.commons.CommonsMultipartFile; importorg.springframework.web.multipart.commons.CommonsMultipartResolver; publicclassMultiCommonsMultipartResolverextendsCommonsMultipartResolver{ publicMultiCommonsMultipartResolver(){ } publicMultiCommonsMultipartResolver(ServletContextservletContext){ super(servletContext); } @Override @SuppressWarnings("unchecked") protectedMultipartParsingResultparseFileItems(ListfileItems,Stringencoding){ MapmultipartFiles=newHashMap(); MapmultipartParameters=newHashMap(); //Extractmultipartfilesandmultipartparameters. for(Iteratorit=fileItems.iterator();it.hasNext();){ FileItemfileItem=(FileItem)it.next(); if(fileItem.isFormField()){ Stringvalue=null; if(encoding!=null){ try{ value=fileItem.getString(encoding); }catch(UnsupportedEncodingExceptionex){ if(logger.isWarnEnabled()){ logger.warn("Couldnotdecodemultipartitem'"+fileItem.getFieldName() +"'withencoding'"+encoding+"':usingplatformdefault"); } value=fileItem.getString(); } }else{ value=fileItem.getString(); } String[]curParam=(String[])multipartParameters.get(fileItem.getFieldName()); if(curParam==null){ //simpleformfield multipartParameters.put(fileItem.getFieldName(),newString[]{value}); }else{ //arrayofsimpleformfields String[]newParam=StringUtils.addStringToArray(curParam,value); multipartParameters.put(fileItem.getFieldName(),newParam); } }else{ //multipartfilefield CommonsMultipartFilefile=newCommonsMultipartFile(fileItem); if(multipartFiles.put(fileItem.getName(),file)!=null){ thrownewMultipartException("Multiplefilesforfieldname["+file.getName() +"]found-notsupportedbyMultipartResolver"); } if(logger.isDebugEnabled()){ logger.debug("Foundmultipartfile["+file.getName()+"]ofsize"+file.getSize() +"byteswithoriginalfilename["+file.getOriginalFilename()+"],stored" +file.getStorageDescription()); } } } returnnewMultipartParsingResult(multipartFiles,multipartParameters); } } spring配置改成你新写的这个类,默认是CommonsMultipartResolver
<beanid="multipartResolver"class="resolver.MultiCommonsMultipartResolver"> <propertyname="maxUploadSize"value="5000000"/> <propertyname="maxInMemorySize"value="5000000"/> </bean>
测试通过。这种解决方案还适用于spring2.5项目中已经做过用spring2.5支持的单文件上传,经测试并不会影响原来的单文件上传。 当然项目中的情况可能比本文中的情况复杂的多,大家可以给我留言。
相关文章推荐
- spring2.5 mvc使用注解upload上传文件
- ssh2(struts2+spring2.5+hibernate3.3+ajax)带进度条文件上传(封装成标签)
- dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(八)SpringMVC上传文件到FastDFS
- spring2.5 mvc使用注解upload上传文件
- spring文件上传文件过大处理机制
- 解决使用Spring Boot、Multipartfile上传文件路径错误问题
- springmvc + form:form 上传文件配置。
- 【Spring】Spring MVC文件上传--整合bootstrap-fileinput和jQuery-File-Upload
- myBatis + SpringMVC上传、下载文件
- spring-mvc的文件上传
- SpringMVC + ajaxfileupload的多文件上传
- Springmvc+uploadify实现文件上传
- Spring Boot 文件上传
- struts2,spring 2.5,hibernate3.2 的配置文件模版
- Spring Boot Web应用开发 文件上传
- 基于Spring+CXF实现用户文件上传的WebService
- spring中文件上传
- spring2.5配置文件 注解
- spring文件上传
- Spring利用MultipartFile接收FormData对象上传文件(可接收AJAX上传的包含多文件的复杂表单内容)