对commons fileupload组件的简单封装
<
input
type
="text"
name
="possess"
>
Stringpossess
=
request.getParameter(
"
possess
"
)
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中的一些配置。
具体实现:
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
本文介绍了一个对commonsfileupload组件的简单封装方案,通过创建MutiFileUpload类简化多文件上传处理过程,使得开发者能够更方便地获取表单字段值。
3107

被折叠的 条评论
为什么被折叠?



