封装了Jakarta 文件上传功能的一个类

封装了Jakarta 文件上传功能的一个类(转)

近期项目要用到文件上传功能, 先试了用 Jsp Smart upload, 结果发现一个问题: 如果上传的文件名中有汉字, 则发生无法读取参数和文件数据的错误. 后来想到 Struts 的文件上传功能在 Tomcat 和 Weblogic 下都没有问题, 就想到用它来做上传功能, 于是到 Apache 网站下载了 Commons FileUpload 看了看, 发现虽然功能都用, 但是使用太不方便, 例如获取表单参数竟然要一个一个的遍历, 于是就动手写了一个封装类, 这个类可以方便的读取表单参数和文件项目.

首先说一下参考资料:
FileUpload 主站点:
http://jakarta.apache.org/commons/fileupload/index.html
下载 FileUpload 的源码:
http://archive.apache.org/dist/jakarta/commons/fileupload/source/
点击 commons-fileupload-1.0-src.zip 下载源码.
下载 FileUpload 的二进制包(JAR文件):
http://archive.apache.org/dist/jakarta/commons/fileupload/binaries/
在列表中点击 commons-fileupload-1.0.zip  26-Jun-2003 08:32  128K,
下载后解压缩得到的 commons-fileupload-1.0.jar 就可以放到类路径中使用了.
Apache 自己的使用指导(英文版), 强烈建议如果要深入了解如何使用的人看看这个网页:
http://jakarta.apache.org/commons/fileupload/using.html

下面就是这个类的源码了(已经在源码注释中包含了使用说明了):

  1  package  studio.beansoft.jsp;
  2  import  java.util. * ;
  3  import  java.io. * ;
  4  import  javax.servlet.http. * ;
  5  import  org.apache.commons.fileupload. * ;
  6  /**
  7   * Jakarta commons FileUpload 封装类.
  8   * 提供: 参数读取(在 Tomcat 4, 5 下测试过似乎没有中文问题), 文件保存功能.
  9   *
 10   * NOTE: 所有的表单和页面编码都是按照 UTF-8 来处理的.
 11   * TODO Refactor to make encoding configable.
 12   *
 13   * 示例代码(在 JSP 页面中, 忽略了异常处理代码):
 14   * test.htm
 15     <form action="test.jsp">
 16     Input name: <input type="text" name="username"><br>
 17     Select a file: <input type="file" name="file1"><br>
 18     <input type="submit" value="Upload">
 19     </form>
 20     test.jsp
 21  <%@ page contentType="text/html;charset=utf8" %>
 22  <%@ page import="studio.beansoft.jsp.*, java.io.*" %>
 23  <%
 24     JakartaFileUploadHandler uploadHandler = new JakartaFileUploadHandler(request);
 25     // 如果是文件上传表单
 26     if(uploadHandler.isMultipart()) {
 27        // 读取参数
 28        String parameterValue = uploadHandler.getParameter("username");
 29        out.println("username=" + parameterValue);
 30        // 保存文件
 31        JakartaFileUploadHandler.saveFileItem(uploadHandler.getFileItem("file1"), new File("file1.txt"));
 32     }
 33  %>
 34     更多参考资料请看 Apache 的网站上的指导文章:
 35     Using FileUpload
 36      @link   http://jakarta.apache.org/commons/fileupload/using.html
 37   *
 38   *  @see  #getParameter(String)
 39   *  @see  #getParameterValues(String)
 40   *  @see  #saveFileItem(FileItem, File)
 41   *
 42   * 这个类依赖于 Jakarta commons-fileupload-1.0.zip.
 43   *
 44   *  @author  beansoft [email protected]
 45   *  @version  1.01
 46   * 2005-11-30
 47    */
 48  public   class  JakartaFileUploadHandler
 49  {
 50       /**  文件域列表  */
 51       private  Map fileFields =   new  TreeMap();
 52       /**  表单域列表  */
 53       private  Map formFields =   new  TreeMap();
 54       /**  Check that we have a file upload request  */
 55       private   boolean  isMultipart  =   false ;
 56       private  HttpServletRequest request  =   null ;
 57       /**
 58       * 空构造器.
 59        */
 60       public  JakartaFileUploadHandler() {
 61      }
 62       /**
 63       * 根据现有参数构造一个上传处理器.
 64        */
 65       public  JakartaFileUploadHandler(HttpServletRequest request) {
 66        setRequest(request);
 67      }
 68       /**
 69       * 设置 HttpServletRequest 并分析里面的表单数据.
 70       *  @param  request - HttpServletRequest
 71        */
 72       public   void  setRequest(HttpServletRequest request) {
 73           this .request  =  request;
 74         isMultipart  =  FileUpload.isMultipartContent(request);
 75          //  如果是文件上传请求, 就提取里面的参数
 76          if (isMultipart) {
 77               //  Create a new file upload handler
 78              DiskFileUpload upload  =   new  DiskFileUpload();
 79               /*
 80               * Nov 29 2005, set default upload encoding to UTF-8.
 81               * Specifies the character encoding to be used when reading the headers of
 82               * individual parts. When not specified, or <code>null</code>, the platform
 83               * default encoding is used.
 84                */
 85              upload.setHeaderEncoding( " UTF-8 " );
 86               try  {
 87                   //  Parse the request
 88                  List  /*  FileItem  */  items  =  upload.parseRequest(request);
 89                   //  Process the uploaded items
 90                  Iterator iter  =  items.iterator();
 91                   while  (iter.hasNext()) {
 92                      FileItem item  =  (FileItem) iter.next();
 93                      String name  =  item.getFieldName();
 94                      String value  =  item.getString();
 95                       if  (item.isFormField()) {
 96                          processFormField(item);
 97                      }  else  {
 98                          processUploadedFile(item);
 99                      }
100                  }
101              }  catch  (Exception ex) {
102                  System.err.println( " 无法处理上传数据: "   +  ex);
103              }
104         }
105      }
106       /**
107       * 处理表单项目.
108       *  @param  item - FileItem 对象
109        */
110       private   void  processFormField(FileItem item) {
111          String name  =  item.getFieldName();
112           //  NOTE 文件上传统一使用 UTF-8 编码 2005-10-16
113          String value  =   null ;
114           try  {
115              value  =  item.getString( " UTF-8 " );
116          }  catch  (UnsupportedEncodingException e) {
117          }
118             //  首先尝试获取原来的值
119          Object oldValue  =  formFields.get(name);
120           if (oldValue  ==   null ) {
121             formFields.put(name, value);
122          }  else  {
123               //  多个值存储为 List
124               //  原来为单个值则添加现有的值
125               try  {
126                  String oldString  =  (String)oldValue;
127                  List list  =   new  ArrayList();
128                  list.add(oldString);
129                  list.add(value);
130                  formFields.put(name, list);
131              }  catch  (Exception ex) {
132  //               ex.printStackTrace();
133              }
134               //  原来为多个值则添加现有的值
135               try  {
136                  List list  =  (List)oldValue;
137                  list.add(value);
138                  formFields.put(name, list);
139              }  catch  (Exception ex) {
140  //               ex.printStackTrace();
141              }
142          }
143      }
144       /**
145       * 处理文件项目.
146       *  @param  item - FileItem 对象
147        */
148       private   void  processUploadedFile(FileItem item) {
149          String name  =  item.getFieldName();
150          fileFields.put(name, item);
151      }
152       /**
153       * 获取上传的文件项目.
154       *  @param  name - String, 文件域名称
155       *  @return  FileItem - org.apache.commons.fileupload.FileItem 对象
156        */
157       public  FileItem getFileItem(String name) {
158           if ( ! isMultipart)  return   null ;
159           return  (FileItem) (fileFields.get(name));
160      }
161       /**
162       * 获取表单参数.
163       *  @param  name - String, 表单域名称
164       *  @return  String - 表单域值
165        */
166       public  String getParameter(String name) {
167           if ( ! isMultipart) {
168              return  request.getParameter(name);
169          }
170          Object value  =  formFields.get(name);
171           if (value  !=   null ) {
172               if (value  instanceof  String) {
173                   return  (String)value;
174              }
175          }
176             return   null ;
177      }
178       /**
179       * 获取表单域的多个参数值.
180       *  @param  name - String, 表单域名称
181       *  @return  String[] - 表单域的多个取值
182        */
183       public  String[] getParameterValues(String name) {
184           if ( ! isMultipart) {
185              return  request.getParameterValues(name);
186          }
187          Object value  =  formFields.get(name);
188           if (value  !=   null ) {
189               if (value  instanceof  List) {
190                   return  (String[]) ((List)value).toArray( new  String[ 0 ]);
191              }
192          }
193             return   null ;
194      }
195       /**
196       * 返回当前请求是否为多部分上传请求.
197        */
198       public   boolean  isMultipart()
199      {
200           return  isMultipart;
201      }
202       /**
203       * 保存 FileItem 对象到指定的文件.
204       *  @param  item - FileItem, 要保存的上传文件项目
205       *  @param  file - File, 要保存到的文件对象
206       *  @return  boolean - 是否保存成功
207        */
208       public   static   boolean  saveFileItem(FileItem item, File file) {
209           try  {
210            item.write(file);
211             return   true ;
212          }  catch  (Exception ex) {
213  //           ex.printStackTrace();
214            System.out.println( " saveFileItem error: "   +  ex);
215          }
216           return   false ;
217      }
218       /**
219       * 获取 FileItem 对象的输入流.
220       *  @param  item - FileItem, 要获取输入流的上传文件对象
221       *  @return  InputStream - 对象的输入流
222        */
223       public   static  InputStream getInputStreamFromFileItem(FileItem item) {
224           try  {
225             return  item.getInputStream();
226          }  catch  (Exception ex) {
227  //           ex.printStackTrace();
228          }
229           return   null ;
230      }
231  }
232 

本文转自 http://beansoft.java-cn.org/Wiki.jsp?page=JakartaFileUploadHandler,收藏参考学习。

你可能感兴趣的:(封装了Jakarta 文件上传功能的一个类)