posts - 27,  comments - 14,  trackbacks - 0

近期项目要用到文件上传功能, 先试了用 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 beansoftstudio@msn.com
 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,收藏参考学习。
posted on 2007-08-09 09:44 Scott.Pan 阅读(999) 评论(0)  编辑  收藏 所属分类: 代码收藏夹

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(4)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜