您的位置:首页 > 编程语言 > Java开发

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支持的单文件上传,经测试并不会影响原来的单文件上传。

当然项目中的情况可能比本文中的情况复杂的多,大家可以给我留言。




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: