利用Jakarta commons fileupload组件实现多文件上传

本文介绍了如何使用 Jakarta Commons FileUpload 组件实现多文件上传功能。文章详细讲解了 FileUpload 的工作原理,包括如何解析 HTTP 请求并区分表单字段与文件数据,最后将文件保存到服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用Jakarta commons fileupload组件实现多文件上传

曾经写过一篇 文章 《利用MultipartFile实现文件上传》,可是最近在工作中,我需要同时上传多个文件,似乎用MultipartFile就不能胜任了,于是想到了Jakarta commons。Jakarta commons真是不错的,有那么多开源且好用的东东,太方便了。好了,闲话少说,开始介绍一下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);
不过,个人觉得这个方法一般不需要,我们一般是在需要上传时才采用fileupload组件处理request请求的。
如果确实是文件上传的请求,我们如何解析该request呢?
//Createafactoryfordisk-basedfileitems
FileItemFactoryfactory=newDiskFileItemFactory();

//Createanewfileuploadhandler
ServletFileUploadupload=newServletFileUpload(factory);

//Parsetherequest
List/**//*FileItem*/items=upload.parseRequest(request);

至此我们已经的到了FileItem的list,对每个Item的处理要考虑是标准的form表单域还是上传文件file域,然后做不同的处理,可以通过以下方式实现:
// Processtheuploadeditems
Iteratoriter = items.iterator();
while (iter.hasNext()) ... {
FileItemitem
=(FileItem)iter.next();

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

}
对于一个简单的form表单域,我们可以通过以下方法得到该域的相关信息:
// Processaregularformfield
if (item.isFormField()) ... {
Stringname
=item.getFieldName();
Stringvalue
=item.getString();
...
}
而对于一个upload file,我们则可以通过如下方式得到其相关信息:
// 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);
好了,到了这里,fileupload组件的基本api已经介绍完了,大家应该有点轮廓了吧?
在下一篇文章中,我会对commons FileUpload组件稍作包装,并做个简单的demo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值