浏览 1695 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-05-28
曾经写过一篇 文章《利用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请求,我们要判断该请求是否是文件上传的请求 // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); 不过,个人觉得这个方法一般不需要,我们一般是在需要上传时才采用fileupload组件处理request请求的。 如果确实是文件上传的请求,我们如何解析该request呢? // Create a factory for disk-based file items FileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Parse the request List /**//* FileItem */ items = upload.parseRequest(request); 至此我们已经的到了FileItem的list,对每个Item的处理要考虑是标准的form表单域还是上传文件file域,然后做不同的处理,可以通过以下方式实现: // Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) ...{
FileItem item = (FileItem) iter.next();
if (item.isFormField()) ...{
processFormField(item);
} else ...{
processUploadedFile(item);
}
}
对于一个简单的form表单域,我们可以通过以下方法得到该域的相关信息: // Process a regular form field
if (item.isFormField()) ...{
String name = item.getFieldName();
String value = item.getString();
...
}
而对于一个upload file,我们则可以通过如下方式得到其相关信息: // Process a file upload
if (!item.isFormField()) ...{
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
...
}
实际上,对于一个上传的文件,我们一般不会把它包存在内存中,除非它足够小。我们一般是把它保存到硬盘上,使用以下方法就可以将上传的文件保存到服务器硬盘上了: File uploadedFile = new File(...); item.write(uploadedFile); 好了,到了这里,fileupload组件的基本api已经介绍完了,大家应该有点轮廓了吧? 在下一篇文章中,我会对commons FileUpload组件稍作包装,并做个简单的demo 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-28
看了一下,感觉不错,以前都是使用的smartUpLoad来做文件上传,下一个项目可以考虑试试
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-28
dennisfeifan 写道 看了一下,感觉不错,以前都是使用的smartUpLoad来做文件上传,下一个项目可以考虑试试
我最先也是用smartUpload上传的,不过后来参加工作就抛弃它了,太繁琐 |
|
| 返回顶楼 | |
|
最后更新时间:2007-05-28
最近刚好有用到,lz介绍的这些也基本够用了,呵呵。
只是这里: // Process a file upload if (!item.isFormField()) ...{ String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); ... } 似乎就算!item.isFormField() 返回真,也不一定说明该item是需要upload的文件,我就碰到这样的问题,item.getName()返回的是"",于是我就加上了非空的判断。 |
|
| 返回顶楼 | |




