`
hbcui1984
  • 浏览: 149945 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对commons fileupload组件的简单封装

    博客分类:
  • java
阅读更多

对commons fileupload组件的简单封装

        在上一篇文章《利用Jakarta commons fileupload组件实现多文件上传》中,我介绍了commons fileupload组件的基本原理和实现方法。但是在实际操作中,我们需要分析每个FileItem,然后从该FileItem中读取该控件的name和value,显然这不符合我们的习惯。比如我们在页面上有个text文本框:
xml 代码
 
  1. <input type="text" name="possess">  
    我们要取得possess传过来的value,一般我们是这么写的:
java 代码
 
  1. String possess = request.getParameter("possess")  
    但是在commons fileupload中我们却需要这么处理:
java 代码
 
  1. DiskFileItemFactory factory = new DiskFileItemFactory();  
  2. //Create a new file upload handler  
  3. ServletFileUpload upload = new ServletFileUpload(factory);  
  4. String possess = "";  
  5. try ...{  
  6.     List items = upload.parseRequest(request);  
  7.     Iterator iterator = items.iterator();  
  8.     while(iterator.hasNext())...{  
  9.         FileItem item = (FileItem)iterator.next();  
  10.         if(item.isFormField())...{                      
  11.             String fieldName = item.getFieldName();  
  12.             String value = item.getString();  
  13.             if(fieldName.equals("possess"))...{  
  14.                 possess = value;  
  15.             }  
  16.         }  
  17.     }  
  18. catch (FileUploadException e) ...{  
  19.     e.printStackTrace();  
  20. }  

      按照上面处理的话,很是不爽,因此我想包装一下,使得使用起来符合我们的习惯。
总体设计思想:
1.我们可以像以前那样,传入控件的name,就可以取得该控件的value,因此我想可以遍历所有FileItem,然后把他们存入一个Map中(key中存入fieldname,value中存入该控件的value),这样就可以达到以上目的了。
2.在该包装类中,我们还要可以设置一些值,从而我们可以更改commons fileupload中的一些配置。
具体实现:
根据以上要求,我写出了一个MutiFileUpload类,代码如下,稍后再做详细解释。
java 代码
 
  1. package chb.commons.fileupload.web;  
  2.   
  3.   
  4.   
  5. import java.util.HashMap;  
  6.   
  7. import java.util.Iterator;  
  8.   
  9. import java.util.List;  
  10.   
  11. import java.util.Map;  
  12.   
  13.   
  14.   
  15. import javax.servlet.http.HttpServlet;  
  16.   
  17. import javax.servlet.http.HttpServletRequest;  
  18.   
  19.   
  20.   
  21. import org.apache.commons.fileupload.FileItem;  
  22.   
  23. import org.apache.commons.fileupload.FileUploadException;  
  24.   
  25. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  26.   
  27. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  28.   
  29.   
  30.   
  31. /** 
  32.  
  33.  * @author chb 
  34.  
  35.  * 
  36.  
  37.  */  
  38.   
  39. public class MutiFileUpload extends HttpServlet{  
  40.   
  41.     private static final long serialVersionUID = 670829239023754119L;  
  42.   
  43.       
  44.   
  45.     protected Map//保存普通form表单域  
  46.   
  47.     protected Map//保存上传的文件  
  48.   
  49.       
  50.   
  51.     /** 
  52.  
  53.      * The directory in which uploaded files will be stored, if stored on disk. 
  54.  
  55.      */  
  56.   
  57.     private int sizeThreshold = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD;  
  58.   
  59.       
  60.   
  61.     /** 
  62.  
  63.      * The maximum size permitted for the complete request, as opposed to 
  64.  
  65.      * {@link #fileSizeMax}. A value of -1 indicates no maximum. 
  66.  
  67.      */  
  68.   
  69.     private long sizeMax = -1;  
  70.   
  71.       
  72.   
  73.     private String encoding = "utf-8";//字符编码,当读取上传表单的各部分时会用到该encoding  
  74.   
  75.       
  76.   
  77.     public String getEncoding() {  
  78.   
  79.         return encoding;  
  80.   
  81.     }  
  82.   
  83.     public void setEncoding(String encoding) {  
  84.   
  85.         this.encoding = encoding;  
  86.   
  87.     }  
  88.   
  89.     public long getSizeMax() {  
  90.   
  91.         return sizeMax;  
  92.   
  93.     }  
  94.   
  95.     public void setSizeMax(long sizeMax) {  
  96.   
  97.         this.sizeMax = sizeMax;  
  98.   
  99.     }  
  100.   
  101.     public int getSizeThreshold() {  
  102.   
  103.         return sizeThreshold;  
  104.   
  105.     }  
  106.   
  107.     public void setSizeThreshold(int sizeThreshold) {  
  108.   
  109.         this.sizeThreshold = sizeThreshold;  
  110.   
  111.     }  
  112.   
  113.     public void parse(HttpServletRequest request){  
  114.   
  115.         parameters = new HashMap
  116.   
  117.         files = new HashMap
  118.   
  119.         //Create a factory for disk-based file items  
  120.   
  121.         DiskFileItemFactory factory = new DiskFileItemFactory();  
  122.   
  123.   
  124.   
  125.         //Set factory constraints  
  126.   
  127.         factory.setSizeThreshold(sizeThreshold);  
  128.   
  129.         //factory.setRepository(repository);  
  130.   
  131.   
  132.   
  133.         //Create a new file upload handler  
  134.   
  135.         ServletFileUpload upload = new ServletFileUpload(factory);  
  136.   
  137.   
  138.   
  139.         //Set overall request size constraint  
  140.   
  141.         upload.setSizeMax(sizeMax);  
  142.   
  143.         upload.setHeaderEncoding(encoding);  
  144.   
  145.   
  146.   
  147.         try {  
  148.   
  149.             List items = upload.parseRequest(request);  
  150.   
  151.             Iterator iterator = items.iterator();  
  152.   
  153.             while(iterator.hasNext()){  
  154.   
  155.                 FileItem item = (FileItem)iterator.next();  
  156.   
  157.                 if(item.isFormField()){                   
  158.   
  159.                     String fieldName = item.getFieldName();  
  160.   
  161.                     String value = item.getString();  
  162.   
  163.                     parameters.put(fieldName, value);  
  164.   
  165.                 }else{  
  166.   
  167.                     String fieldName = item.getFieldName();  
  168.   
  169.                     files.put(fieldName, item);  
  170.   
  171.                 }  
  172.   
  173.             }  
  174.   
  175.         } catch (FileUploadException e) {  
  176.   
  177.             e.printStackTrace();  
  178.   
  179.         }  
  180.   
  181.     }  
  182.   
  183.     /** 得到上传文件的文件名 
  184.  
  185.      * @param item 
  186.  
  187.      * @return 
  188.  
  189.      */  
  190.   
  191.     public String getFileName(FileItem item){  
  192.   
  193.         String fileName = item.getName();  
  194.   
  195.         fileName = replace(fileName,"\\","/"); 
  196.  
  197.         fileName = fileName.substring(fileName.lastIndexOf("/")+1);  
  198.   
  199.         return fileName;  
  200.   
  201.     }  
  202.   
  203.     /**字符串替换 
  204.  
  205.      * @param source 
  206.  
  207.      * @param oldString 
  208.  
  209.      * @param newString 
  210.  
  211.      * @return 
  212.  
  213.      */  
  214.   
  215.     public static String replace(String source, String oldString, String newString) {  
  216.   
  217.         StringBuffer output = new StringBuffer();  
  218.   
  219.   
  220.   
  221.         int lengthOfSource = source.length();   
  222.   
  223.         int lengthOfOld = oldString.length();   
  224.   
  225.         int posStart = 0;   
  226.   
  227.         int pos;   
  228.   
  229.   
  230.   
  231.         while ((pos = source.indexOf(oldString, posStart)) >= 0) {  
  232.   
  233.             output.append(source.substring(posStart, pos));  
  234.   
  235.             output.append(newString);  
  236.   
  237.             posStart = pos + lengthOfOld;  
  238.   
  239.         }  
  240.   
  241.         if (posStart < lengthOfSource) {  
  242.   
  243.             output.append(source.substring(posStart));  
  244.   
  245.         }  
  246.   
  247.         return output.toString();  
  248.   
  249.     }  
  250.   
  251.   
  252.   
  253. }  
   以上代码很简单,看过commons FileUpload组件API的程序员,应该都能看明白。值得注意一下的是:编码问题(setHeaderEncoding),这个方法是从FileUploadBase类里继承的,根据其说明,当读取上传表单的各部分时会用到该encoding,如果没有指定encoding则使用系统缺省的encoding。建议在这里设置成utf-8,并把jsp的charset也设置成utf-8,否则可能会出现乱码。
测试demo
 好了,下面我就写个简单的demo吧,说明一下MutiFileUpload的用法。
  1.新建一个jsp页面,注意设置form表单的enctype,如下:
xml 代码
 
  1. <form id="form1" method="post" action="../servlet/UploadServlet" enctype="multipart/form-data">  
  2.                   
  3.                 <tr>  
  4.                     <td width="25%" align="right">上传图片:<!---->td>  
  5.                     <td>                              
  6.                         <input id="file1" type="file" NAME="file1" style="width:300px;">                                                          
  7.                     <!---->td>  
  8.                 <!---->tr>  
  9.                 <tr>  
  10.                     <td width="25%" align="right">上传音频:<!---->td>  
  11.                     <td>                              
  12.                         <input id="file2" type="file" NAME="file2" style="width:300px;">                                                          
  13.                     <!---->td>  
  14.                 <!---->tr>  
  15.                 <tr align="center" valign="middle">  
  16.                     <td height="60" colspan="2">  
  17.                         <input type="submit" id="BtnOK" value="确认上传">       
  18.                         <button onclick="javascript:window.opener == null;window.close();">取消上传<!---->button> <!---->td>  
  19.                 <!---->tr>  
  20.                 <tr align="center" valign="middle">  
  21.                     <td height="60" colspan="2">  
  22.                          <input type="text" name="possess" value="private">  
  23.                     <!---->td>  
  24.                 <!---->tr>  
  25.         <!---->form>  
 2.新建一个UploadServlet并继承自MutiFileUpload,如下:
java 代码
 
  1. public class UploadServlet extends MutiFileUpload ...{  
  2. }  
      3.然后在post方法中如下处理:
java 代码
 
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)  
  2.         throws ServletException, IOException {  
  3.       
  4.     parse(request);  
  5.     System.out.println(parameters.get("possess"));  
  6.     Iterator iterator = files.values().iterator();  
  7.     while(iterator.hasNext()){  
  8.         FileItem item = (FileItem) iterator.next();  
  9.         String fileName = getFileName(item);  
  10.         File file = new File("/root/upload/"+fileName);  
  11.         try {  
  12.             item.write(file);  
  13.         } catch (Exception e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17. }  
     选择上传文件,然后我们就可以在/root/upload下看到我们上传的文件了。

        好了,先写到这里吧,具体应用时,我们可能需要很多变通,比如集成到spring,hibernate中,关键是给出一个想法,我们可以对他进行包装变更,使其更适合我们的系统。



分享到:
评论
5 楼 yeafee 2007-06-22  
支持一下。
4 楼 hbcui1984 2007-05-30  
joachimz 写道
Spring有对MultipleFile的处理,同时支持commons fileupload和cos。
如果不使用spring web,也可以简单的通过一个filter把该功能独立弄出来使用。不用自己实现吧!


谢谢指教,我对spring不是太熟悉,这两天去查一下。
3 楼 joachimz 2007-05-29  
Spring有对MultipleFile的处理,同时支持commons fileupload和cos。
如果不使用spring web,也可以简单的通过一个filter把该功能独立弄出来使用。不用自己实现吧!
2 楼 hbcui1984 2007-05-29  
spiritfrog 写道
只是封装一下commons的fileupload,那就没有必要继承HttpServlet了吧?再者你写的replace方法跟String的replaceAll有什么区别吗?


说实在的,确实没必要继承HttpServlet,最初的考虑是把这个MutiFileUpload类写到commons fileupload组件中,然后让上传文件的servlet直接继承自MutiFileUpload类,所以就成了现在的这个结构。

在实际使用过程中,MutiFileUpload完全可以不继承自HttpServlet,而把它作为一个Helper类或者Util类使用,然后再在上传文件的servlet中调用MutiFileUpload的方法。

replace方法和String的replaceAll功能是一样的,但是replace不支持正则表达式,因为这个方法是我很早以前就写过的方法,所以习惯性的就加进去了。
1 楼 spiritfrog 2007-05-29  
只是封装一下commons的fileupload,那就没有必要继承HttpServlet了吧?再者你写的replace方法跟String的replaceAll有什么区别吗?

相关推荐

    使用fileupload组件实现文件上传功能

    使用fileupload组件实现文件上传功能 FileUpload组件是Apache提供的一款文件上传组件,能够帮助我们轻松实现文件上传功能。下面我们将详细介绍使用FileUpload组件实现文件上传功能的步骤和要点: 首先,需要引入两...

    利用commons-fileupload上传组件上传文件(一)

    在本文中,我们将深入探讨如何使用Apache Commons FileUpload组件来实现文件上传功能。Apache Commons FileUpload是一个用于处理HTTP请求中的多部分数据的Java库,特别适用于处理文件上传。这个组件使得在Servlet或...

    commons-fileupload-1.2.2.jar.zip

    《Apache Commons FileUpload组件详解与应用实践》 Apache Commons FileUpload是Java开发中处理文件上传的一个强大工具,尤其在Web应用程序中,它提供了一种高效且灵活的方式来处理用户通过表单上传的文件。这个...

    Java 文件上传组件 Apache Commons FileUpload 应用指南

    以下是对 FileUpload 组件的详细解释及其应用指南: 1. **文件上传原理** - RFC1867 引入了在 HTML 表单中上传文件的功能,要求使用 `multipart/form-data` 编码类型。客户端浏览器在提交包含文件的表单时,会将...

    commons-fileupload文件上传实例

    本教程将详细介绍如何利用commons-fileupload实现文件上传功能,并提供一个简单的实例。 **一、Apache Commons FileUpload简介** Apache Commons FileUpload是Apache软件基金会开发的一个开源组件,专门处理HTTP...

    上传文件jar包commons-fileupload.jar和commons-io-2.6.jar

    在实际应用中,`commons-fileupload.jar`通常与`commons-io-2.6.jar`一起使用,因为FileUpload组件在处理文件上传时,可能会依赖于Commons IO库的一些功能,比如文件的读写操作。通过这两个库,开发者可以轻松地在...

    文件上传组件-Apache-Commons-FileUpload-应用指南.docx

    以下是对Apache Commons FileUpload组件的应用指南: 1. **获取上传组件**: - 首先,你需要访问Apache Commons FileUpload的官方网站(http://commons.apache.org/proper/commons-fileupload/)下载最新版本的...

    commons-fileupload-1.2.1-bin 和 commons-io-1.4-bin.zip

    4. 当用户提交表单时,Commons FileUpload会自动处理请求,将文件内容封装成FileItem对象。 5. 在Action类的execute方法中,通过HttpServletRequest的`getParts()`或`getInputStream()`方法获取FileItem对象,然后...

    commons组件包含了fileupload、io两个jar文件

    在你提到的“commons组件”中,主要包括了两个关键部分:`commons-fileupload`和`commons-io`。这两个组件在Java开发中扮演着重要角色,尤其是在处理文件上传和I/O操作时。 **1. Commons FileUpload** `commons-...

    commons-io,commons-fileupload-1.2.2

    `InputStreamReader` 和 `OutputStreamWriter` 的封装类使得在不同字符集之间转换变得简单。此外,`IOExceptions` 提供了一种方便的机制来处理可能抛出的异常,简化了错误处理代码。 Apache Commons FileUpload 则...

    commons-fileupload-1.2.1.jar和commons-io-2.0.jar

    `MultipartFile`是Spring MVC提供的接口,它封装了`commons-fileupload`解析出来的文件信息。 在实际应用中,为了处理上传的文件,你需要按照以下步骤进行: 1. 检查`MultipartFile`对象是否为空,以及文件大小和...

    commons 系列组件

    `FileItem`是FileUpload的核心类,它封装了单个上传项,无论是文本字段还是文件。通过`isFormField()`方法,我们可以判断该项是否为普通表单字段,如果不是,则可以调用`write()`方法将文件内容写入目标位置。此外,...

    common fileupload上传组件包

    这个包包含两个核心组件:`commons-io-1.4.jar`和`commons-fileupload-1.2.1.jar`。这两个组件在实现文件上传过程中扮演着至关重要的角色。 1. **Apache Commons IO** `commons-io-1.4.jar`是Apache Commons项目的...

    Smartupload_and_commons-fileupload.rar_smartupload

    在性能方面,由于SmartUpload的封装程度较高,对于简单的文件上传需求,它的使用更为便捷。然而,当涉及到复杂场景或者需要高度定制时,Commons FileUpload可能更有优势,因为它允许开发者深入到上传过程的每一个...

    commons-eamil和commons-fileupload包

    在你提到的“commons-eamil和commons-fileupload包”中,这两个组件是Apache Commons项目下的两个子模块,主要用于处理电子邮件和文件上传功能。 **Apache Commons Email** `commons-email`是一个用于创建和发送...

    文件上传组件-Apache-Commons-FileUpload-应用指南.pdf

    以下是对该组件的详细说明: 1. **组件获取与安装** 要使用Apache Commons FileUpload,首先需要从Apache官方网站下载最新版本的库文件。通常,你需要两个类库文件:`commons-fileupload-x.x.x.jar`和`commons-io-...

    commons-fileupload-1.3-bin.tar.gz

    Apache Commons FileUpload组件是Apache软件基金会 Commons项目的一部分,旨在为Java应用程序提供处理HTTP协议中的多部分(multipart)请求的能力。这个组件可以解析多部分数据,包括文件上传,并将每个部分转换为可...

    commons-fileupload-1.2-bin.tar.gz

    《Apache Commons FileUpload组件详解与应用实践》 Apache Commons FileUpload是Java开发中处理文件上传的一个强大工具,尤其在Web应用程序中,它提供了一种优雅、高效且易于使用的API来处理用户通过表单提交的多...

    commons上传jar组件

    FileUpload库则封装了这些细节,提供了一套简单易用的API,使得文件上传变得轻而易举。 使用Commons FileUpload库的步骤大致如下: 1. **依赖引入**:首先,你需要将Apache Commons FileUpload的JAR包添加到你的...

Global site tag (gtag.js) - Google Analytics