利用Jakarta commons fileupload组件实现多文件上传
首先,需要到其 官网上下载最新的jar包及其依赖的jar包,然后可以参考一下它的user guide,很简单,想信大家都能看懂,这里就把主要的内容提一下(相当于一个删减的翻译)。
一.基本原理
FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。
二.具体实现
对一个HttpRequest请求,我们要判断该请求是否是文件上传的请求
//
Checkthatwehaveafileuploadrequest
boolean
isMultipart
=
ServletFileUpload.isMultipartContent(request);
如果确实是文件上传的请求,我们如何解析该request呢?
//Createafactoryfordisk-basedfileitems
FileItemFactoryfactory=newDiskFileItemFactory();
//Createanewfileuploadhandler
ServletFileUploadupload=newServletFileUpload(factory);
//Parsetherequest
List/**//*FileItem*/items=upload.parseRequest(request);
//
Processtheuploadeditems
Iteratoriter
=
items.iterator();
while
(iter.hasNext())
...
{
FileItemitem=(FileItem)iter.next();

if(item.isFormField())...{
processFormField(item);
}else...{
processUploadedFile(item);
}
}
//
Processaregularformfield

if
(item.isFormField())
...
{
Stringname=item.getFieldName();
Stringvalue=item.getString();
...
}
//
Processafileupload

if
(
!
item.isFormField())
...
{
StringfieldName=item.getFieldName();
StringfileName=item.getName();
StringcontentType=item.getContentType();
booleanisInMemory=item.isInMemory();
longsizeInBytes=item.getSize();
...
}
FileuploadedFile
=
new
File(...);
item.write(uploadedFile);
在下一篇文章中,我会对commons FileUpload组件稍作包装,并做个简单的demo
本文介绍了Jakarta Commons FileUpload组件的基本原理及其实现多文件上传的具体步骤。通过FileUpload组件可以解析HTTP请求,区分普通表单字段与文件字段,并进行相应处理。
2403

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



