对commons fileupload组件的简单封装
在上一篇文章《
利用Jakarta commons fileupload组件实现多文件上传》中,我介绍了commons fileupload组件的基本原理和实现方法。但是在实际操作中,我们需要分析每个FileItem,然后从该FileItem中读取该控件的name和value,显然这不符合我们的习惯。比如我们在页面上有个text文本框:
<inputtype="text"name="possess">
我们要取得possess传过来的value,一般我们是这么写的:
Stringpossess=request.getParameter("possess")
但是在commons fileupload中我们却需要这么处理:
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//Createanewfileuploadhandler
ServletFileUploadupload=newServletFileUpload(factory);
Stringpossess="";
try...{
Listitems=upload.parseRequest(request);
Iteratoriterator=items.iterator();
while(iterator.hasNext())...{
FileItemitem=(FileItem)iterator.next();
if(item.isFormField())...{
StringfieldName=item.getFieldName();
Stringvalue=item.getString();
if(fieldName.equals("possess"))...{
possess=value;
}
}
}
}catch(FileUploadExceptione)...{
e.printStackTrace();
}
按照上面处理的话,很是不爽,因此我想包装一下,使得使用起来符合我们的习惯。
总体设计思想:1.我们可以像以前那样,传入控件的name,就可以取得该控件的value,因此我想可以遍历所有FileItem,然后把他们存入一个Map中(key中存入fieldname,value中存入该控件的value),这样就可以达到以上目的了。
2.在该包装类中,我们还要可以设置一些值,从而我们可以更改commons fileupload中的一些配置。
具体实现: 根据以上要求,我写出了一个MutiFileUpload类,代码如下,稍后再做详细解释。
packagechb.commons.fileupload.web;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importorg.apache.commons.fileupload.FileItem;
importorg.apache.commons.fileupload.FileUploadException;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
/***//**
*@authorchb
*
*/
publicclassMutiFileUploadextendsHttpServlet...{
privatestaticfinallongserialVersionUID=670829239023754119L;
protectedMap<String,String>parameters;//保存普通form表单域
protectedMap<String,FileItem>files;//保存上传的文件
/***//**
*Thedirectoryinwhichuploadedfileswillbestored,ifstoredondisk.
*/
privateintsizeThreshold=DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD;
/***//**
*Themaximumsizepermittedforthecompleterequest,asopposedto
*{@link#fileSizeMax}.Avalueof-1indicatesnomaximum.
*/
privatelongsizeMax=-1;
privateStringencoding="utf-8";//字符编码,当读取上传表单的各部分时会用到该encoding
publicStringgetEncoding()...{
returnencoding;
}
publicvoidsetEncoding(Stringencoding)...{
this.encoding=encoding;
}
publiclonggetSizeMax()...{
returnsizeMax;
}
publicvoidsetSizeMax(longsizeMax)...{
this.sizeMax=sizeMax;
}
publicintgetSizeThreshold()...{
returnsizeThreshold;
}
publicvoidsetSizeThreshold(intsizeThreshold)...{
this.sizeThreshold=sizeThreshold;
}
publicvoidparse(HttpServletRequestrequest)...{
parameters=newHashMap<String,String>();
files=newHashMap<String,FileItem>();
//Createafactoryfordisk-basedfileitems
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//Setfactoryconstraints
factory.setSizeThreshold(sizeThreshold);
//factory.setRepository(repository);
//Createanewfileuploadhandler
ServletFileUploadupload=newServletFileUpload(factory);
//Setoverallrequestsizeconstraint
upload.setSizeMax(sizeMax);
upload.setHeaderEncoding(encoding);
try...{
Listitems=upload.parseRequest(request);
Iteratoriterator=items.iterator();
while(iterator.hasNext())...{
FileItemitem=(FileItem)iterator.next();
if(item.isFormField())...{
StringfieldName=item.getFieldName();
Stringvalue=item.getString();
parameters.put(fieldName,value);
}else...{
StringfieldName=item.getFieldName();
files.put(fieldName,item);
}
}
}catch(FileUploadExceptione)...{
e.printStackTrace();
}
}
/***//**得到上传文件的文件名
*@paramitem
*@return
*/
publicStringgetFileName(FileItemitem)...{
StringfileName=item.getName();
fileName=replace(fileName,"/","/");
fileName=fileName.substring(fileName.lastIndexOf("/")+1);
returnfileName;
}
/***//**字符串替换
*@paramsource
*@paramoldString
*@paramnewString
*@return
*/
publicstaticStringreplace(Stringsource,StringoldString,StringnewString)...{
StringBufferoutput=newStringBuffer();
intlengthOfSource=source.length();
intlengthOfOld=oldString.length();
intposStart=0;
intpos;
while((pos=source.indexOf(oldString,posStart))>=0)...{
output.append(source.substring(posStart,pos));
output.append(newString);
posStart=pos+lengthOfOld;
}
if(posStart<lengthOfSource)...{
output.append(source.substring(posStart));
}
returnoutput.toString();
}
}
以上代码很简单,看过commons FileUpload组件API的程序员,应该都能看明白。值得注意一下的是:编码问题(setHeaderEncoding),这个方法是从
FileUploadBase类里继承的,根据其说明,当读取上传表单的各部分时会用到该encoding,如果没有指定encoding则使用系统缺省的encoding。建议在这里设置成utf-8,并把jsp的charset也设置成utf-8,否则可能会出现乱码。
测试demo
好了,下面我就写个简单的demo吧,说明一下MutiFileUpload的用法。
1.新建一个jsp页面,注意设置form表单的enctype,如下:
<formid="form1"method="post"action="../servlet/UploadServlet"enctype="multipart/form-data">
<tr>
<tdwidth="25%"align="right">上传图片:</td>
<td>
<inputid="file1"type="file"NAME="file1"style="width:300px;">
</td>
</tr>
<tr>
<tdwidth="25%"align="right">上传音频:</td>
<td>
<inputid="file2"type="file"NAME="file2"style="width:300px;">
</td>
</tr>
<tralign="center"valign="middle">
<tdheight="60"colspan="2">
<inputtype="submit"id="BtnOK"value="确认上传">
<buttononclick="javascript:window.opener==null;window.close();">取消上传</button></td>
</tr>
<tralign="center"valign="middle">
<tdheight="60"colspan="2">
<inputtype="text"name="possess"value="private">
</td>
</tr>
</form>
2.新建一个UploadServlet并继承自MutiFileUpload,如下:
publicclassUploadServletextendsMutiFileUpload...{
}
3.然后在post方法中如下处理:
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException...{
parse(request);
System.out.println(parameters.get("possess"));
Iteratoriterator=files.values().iterator();
while(iterator.hasNext())...{
FileItemitem=(FileItem)iterator.next();
StringfileName=getFileName(item);
Filefile=newFile("/root/upload/"+fileName);
try...{
item.write(file);
}catch(Exceptione)...{
e.printStackTrace();
}
}
}
选择上传文件,然后我们就可以在/root/upload下看到我们上传的文件了。
好了,先写到这里吧,具体应用时,我们可能需要很多变通,比如集成到spring,hibernate中,关键是给出一个想法,我们可以对他进行包装变更,使其更适合我们的系统。
分享到:
相关推荐
文章目录文件上传commons-fileupload组件基于表单的文件上传MultipartFile接口文件下载文件下载的实现方法文件下载的过程 文件上传 Spring MVC 框架的文件上传是基于 commons-fileupload 组件的文件上传,只不过 ...
FileUpload获取表单中参数的方法并对该组件做了进一点封装,使其更容易使用,并支持单文件上传和多文件上传两种方式,首先定义一个基类放置公共属性: FileUploadBase.java import java.io.File; import java.util....
当上传文件大于缓冲区大小时, fileupload组件将使用临时文ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有: boolean isMultipartContent...
spring-jdbc-4.0.0.RELEASE.jar 对Spring 对JDBC 数据访问进行封装的所有类 spring-orm-4.0.0.RELEASE.jar Spring对DAO特性集进行了扩展 spring-tx-4.0.0.RELEASE.jar 事务相关的类 spring-web-4.0.0.RELEASE.jar ...
spring-test.jar:对JUNIT等测试框架的简单封装 spring-tx.jar:为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理。 spring-webmvc-portlet.jar:Spring MVC的增强 spring-websocket.jar:
3.commons-collections-3.2.1.jar(commons项目中的子项目,是对collection集合的封装) 4.dom4j-1.6.1.jar(对dom4j的封装,是解析xml文件的) 5.javassist-3.9.0.GA.jar(一个开源的分析、编辑和创建Java字节码的...
3.commons-collections-3.2.1.jar(commons项目中的子项目,是对collection集合的封装) 4.dom4j-1.6.1.jar(对dom4j的封装,是解析xml文件的) 5.javassist-3.9.0.GA.jar(一个开源的分析、编辑和创建Java字节码的...
3.commons-collections-3.2.1.jar(commons项目中的子项目,是对collection集合的封装) 4.dom4j-1.6.1.jar(对dom4j的封装,是解析xml文件的) 5.javassist-3.9.0.GA.jar(一个开源的分析、编辑和创建Java字节码的...
Apache fileupload 文件上传组件 Apache commons-collections 封装好的各种集合类和集合工具类 Apache commons-io Apache基金会创建并维护的Java函数库 Apache commons-logging 通用的日志接口 dom4j 优秀的
18.2 封装javabean的commons-beanutils组件 18.3 关于hibernate框架中一些通用类 18.4 实现hibernate分页系统前期准备 18.5 关于hibernate分页系统的具体实现 18.6 关于hibernate分页系统的表示层 ...
<commons-fileupload.version>1.3.1</commons-fileupload.version> <jedis.version>2.7.2 <solrj.version>4.10.3 <!-- 时间操作组件 --> <groupId>joda-time <artifactId>joda-time ${joda-time...