对commons fileupload上传组件的简单封装

在上一篇文章《利用Jakarta commons
fileupload组件实现多文件上传
》中,我介绍了commons
fileupload组件的基本原理和实现方法。但是在实际操作中,我们需要分析每个FileItem,然后从该FileItem中读取该控件的name和value,显然这不符合我们的习惯。比如我们在页面上有个text文本框:

<input type="text" name="possess">

我们要取得possess传过来的value,一般我们是这么写的:

String possess = request.getParameter("possess")

但是在commons fileupload中我们却需要这么处理:

        DiskFileItemFactory factory = new DiskFileItemFactory();

//Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);

String possess = "";

try {

List items = upload.parseRequest(request);

Iterator iterator = items.iterator();

while(iterator.hasNext()){

FileItem item = (FileItem)iterator.next();

if(item.isFormField()){

String fieldName = item.getFieldName();

String value = item.getString();

if(fieldName.equals("possess")){
                       possess = value;

}

}

}

} catch (FileUploadException e) {

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;

public class MutiFileUpload extends HttpServlet{

private static final long serialVersionUID = 670829239023754119L;

protected Map<String, String> parameters;//保存普通form表单域
    protected Map<String, FileItem> files;//保存上传的文件

private int sizeThreshold = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD;

private long sizeMax = -1;

private String encoding = "utf-8";//字符编码,当读取上传表单的各部分时会用到该encoding

public String getEncoding() {

return encoding;

}

public void setEncoding(String encoding) {

this.encoding = encoding;

}

public long getSizeMax() {

return sizeMax;

}

public void setSizeMax(long sizeMax) {

this.sizeMax = sizeMax;

}

public int getSizeThreshold() {

return sizeThreshold;

}

public void setSizeThreshold(int sizeThreshold) {

this.sizeThreshold = sizeThreshold;

}

public void parse(HttpServletRequest request){

parameters = new HashMap<String, String>();

files = new HashMap<String, FileItem>();

//Create a factory for disk-based file items

DiskFileItemFactory factory = new DiskFileItemFactory();

//Set factory constraints
        factory.setSizeThreshold(sizeThreshold);

//factory.setRepository(repository);

//Create a new file upload handler

ServletFileUpload upload = new ServletFileUpload(factory);

//Set overall request size constraint

upload.setSizeMax(sizeMax);

upload.setHeaderEncoding(encoding);

try {

List items = upload.parseRequest(request);

Iterator iterator = items.iterator();

while(iterator.hasNext()){

FileItem item = (FileItem)iterator.next();

if(item.isFormField()){

String fieldName = item.getFieldName();

String value = item.getString();

parameters.put(fieldName, value);

}else{

String fieldName = item.getFieldName();

files.put(fieldName, item);

}

}

} catch (FileUploadException e) {

e.printStackTrace();

}

}

public String getFileName(FileItem item){

String fileName = item.getName();

fileName = replace(fileName,"\\","/");

fileName = fileName.substring(fileName.lastIndexOf("/")+1);

return fileName;

}

public static String replace(String source, String oldString, String newString) {

StringBuffer output = new StringBuffer();

int lengthOfSource = source.length();

int lengthOfOld = oldString.length();

int posStart = 0;

int pos;

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));

}

return output.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="file1" style="width:300px;">

</td>

</tr>

<tr>

<td width="25%" align="right">上传音频:</td>

<td>

<input id="file2" type="file" NAME="file2" style="width:300px;">

</td>

</tr>

<tr align="center" valign="middle">

<td height="60" colspan="2">

<input type="submit" id="BtnOK" value="确认上传">

<button onclick="javascript:window.opener == null;window.close();">取消上传</button> </td>

</tr>

<tr align="center" valign="middle">

<td height="60" colspan="2">

<input type="text" name="possess" value="private">

</td>

</tr>

</form>

2.新建一个UploadServlet并继承自MutiFileUpload,如下:

public class UploadServlet extends MutiFileUpload {

}

3.然后在post方法中如下处理:

    public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

parse(request);

System.out.println(parameters.get("possess"));

Iterator iterator = files.values().iterator();

while(iterator.hasNext()){

FileItem item = (FileItem) iterator.next();

String fileName = getFileName(item);

File file = new File("/root/upload/",fileName);

try {

item.write(file);

} catch (Exception e) {

e.printStackTrace();

}

}

}

选择上传文件,然后我们就可以在/root/upload下看到我们上传的文件了。
       
好了,先写到这里吧,具体应用时,我们可能需要很多变通,比如集成到spring,hibernate中,关键是给出一个想法,我们可以对他进行包装变更,使其更适合我们的系统。

文件上传之 commons-fileupload(二)的更多相关文章

  1. JSP 文件上传下载系列之二[Commons fileUpload]

    前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是:  让添加强壮,高性能的文件到你的se ...

  2. jsp简易文件上传(common.fileupload)

    昨天开始重新架构我的V&View(维视),之前写文章使用的是一个kindediter的插件,挺好用的.最近不知道咋了,出现了些小问题.早在写V&View的时候就想用以下两种方法实现文章 ...

  3. 实现文件上传功能(FileUpload组件)

    文件上传: 项目中经常用到文件上传. 自己实现文件上传,使用文件上传组件fileupload组件 1.指定表单类型为文件上传, enctype=”multipart/form-data” 2.提交方式 ...

  4. .Net 使用文件上传控件FileUpload上传图片

    例1: 来源:http://long546324.iteye.com/blog/349946 Default.aspx文档: <%@ Page Language="C#" A ...

  5. MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...

  6. C# 之 FTPserver中文件上传与下载(二)

            通过上一篇博客<C# 之 FTPserver中文件上传与下载(一)>,我们已经创建好了一个FTPserver,而且该server须要username和password的验证 ...

  7. web文件上传的总结(二)改变Apache默认post值来提高文件上传大小

    上传的文件大小大于2MB的解决方法 #默认apache 允许上大小2MB #技术经理-->修改apache默认配置  php.ini (授权) (1)复制 php.ini -> php1. ...

  8. Struts2实现文件上传报错(二)

    1.具体报错如下 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -he ...

  9. 转:在Struts 2中实现文件上传

    (本文转自:http://www.blogjava.net/max/archive/2007/03/21/105124.html) 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题 ...

  10. Spring MVC文件上传教程 commons-io/commons-uploadfile

    Spring MVC文件上传教程 commons-io/commons-uploadfile 用到的依赖jar包: commons-fileupload 1.3.1 commons-io 2.4 基于 ...

随机推荐

  1. OCP试题解析之053-17 CONFIGURE CONTROLFILE AUTOBACKUP ON

    17.You configure AUTOBACKUP to ON in an RMAN session. When will RMAN back up the control file? (Choo ...

  2. android sdk下载SDK Platform失败记录

    在使用android sdk manager下载的时候会遇到 下载完毕后,你可能会出现如下图一样的错误,就算重复尝试多次依然无法正常安装 Downloading SDK Platform Androi ...

  3. DevExpress 小计 GridControl 隔行换行

    摘自: http://www.cnblogs.com/yuerdongni/archive/2012/09/08/2676753.html 1. 如何解决单击记录整行选中的问题 View->Op ...

  4. MySQL分库备份与分表备份

    MySQL分库备份与分表备份 1.分库备份 要求:将mysql数据库中的用户数据库备份,备份的数据库文件以时间命名 脚本内容如下: [root@db01 scripts]# vim backup_da ...

  5. RocketMQ通信协议

    我们先从client端看一个消息是如何发送到服务端,服务端又是如何解析消息的. client端: 构造请求体: 构造请求体: 发送消息体: 下面看服务端: rocketmq的协议服务端解析救灾这里了R ...

  6. projecteuler----&gt;problem=10----Summation of primes

    title: The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below tw ...

  7. html中css三种常见的样式选择器

    1:标签选择器 标签选择器,是所有带有某种标签的都生效.这里以p为例,也就是所有的带有p标记的都会这样的样式 复制代码 代码如下: <html><head><stylet ...

  8. 算法笔记_104:蓝桥杯练习 算法提高 新建Microsoft Word文档(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫<新建Microsoft Word文档>吗? ...

  9. 算法笔记_090:蓝桥杯练习 7-1用宏求球的体积(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 使用宏实现计算球体体积的功能.用户输入半径,系统输出体积.不能使用函数,pi=3.1415926,结果精确到小数点后五位. 样例输入 一个 ...

  10. 小程序数组合并concat

      arr1=arr1.concat(arr2)   文章来源:刘俊涛的博客 地址:http://www.cnblogs.com/lovebing 欢迎关注,有问题一起学习欢迎留言.评论.