对commons fileupload组件的简单封装

对commons fileupload组件的简单封装

在上一篇文章《 利用Jakarta commons fileupload组件实现多文件上传》中,我介绍了commons fileupload组件的基本原理和实现方法。但是在实际操作中,我们需要分析每个FileItem,然后从该FileItem中读取该控件的name和value,显然这不符合我们的习惯。比如我们在页面上有个text文本框:
< input type ="text" name ="possess" >
我们要取得possess传过来的value,一般我们是这么写的:
Stringpossess = request.getParameter( " possess " )
但是在commons fileupload中我们却需要这么处理:
DiskFileItemFactoryfactory = new DiskFileItemFactory();
// Createanewfileuploadhandler
ServletFileUploadupload = new ServletFileUpload(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类,代码如下,稍后再做详细解释。
package chb.commons.fileupload.web;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;


import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileUploadException;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;



/***/ /**

*
@authorchb

*

*/


public class MutiFileUpload extends HttpServlet ... {

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,如下:
< form id ="form1" method ="post" action ="../servlet/UploadServlet" enctype ="multipart/form-data" >

< tr >
< td width ="25%" align ="right" > 上传图片: </ td >
< td >
< input id ="file1" type ="file" NAME
分享到:
评论
ihuashao
  • 浏览: 1347651 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

你可能感兴趣的:(apache,jsp,servlet)