common-fileupload实例(表单含有普通域和文件域)

转自 http://blog.csdn.net/learner9023/article/details/8252920

一个小小的事情搞了一天,真心觉得不好。现在终于可以总结一下。

首先是form enctype属性,

描述
application/x-www-form-urlencoded 在发送前编码所有字符(默认)
multipart/form-data 不对字符编码。

在使用包含文件上传控件的表单时,必须使用该值。

text/plain 空格转换为 "+" 加号,但不对特殊字符编码。

在form中设置enctype='mulipart/form-data

提交到servlet之后,通过判断ServletFileUpload的实例取得表单所有内容,然后逐一判断是否为普通表单域(isFormField)。

以上是整体思路,和大致过程,以及要注意的细节。下面上具体代码

JSP页面如下:

[html] view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My fileupload page</title>  
  13.   </head>  
  14.     
  15.   <body>  
  16.     <form method='post' action='servlet/fileUploadServlet' enctype='multipart/form-data'>  
  17.     <input type='file' >  
  18.     <input type='submit' value='上传'>  
  19.     </form>  
  20.   </body>  
  21. </html>  


Servlet如下:

[java] view plain copy
  1. package com.butterfly.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.io.PrintWriter;  
  6. import java.util.Iterator;  
  7. import java.util.List;  
  8.   
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. import org.apache.commons.fileupload.FileItem;  
  15. import org.apache.commons.fileupload.FileUploadException;  
  16. import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;  
  17. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  18. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  19.   
  20. public class fileUploadServlet extends HttpServlet {  
  21.   
  22.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  23.             throws ServletException, IOException {  
  24.             doPost(request,response);  
  25.     }  
  26.   
  27.       
  28.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  29.             throws ServletException, IOException {  
  30.         response.setContentType("text/html");  
  31.         PrintWriter out = response.getWriter();  
  32.         final long MAX_SIZE = 300*1024*1024;//设置上传文件最大值  
  33.         final String[] allowedExt = new String[] {"jpg","bmp","gif"};//允许上传的文件格式列表  
  34.         DiskFileItemFactory dfif = new DiskFileItemFactory();//实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload  
  35.         dfif.setSizeThreshold(4096);//设置上传文件适用于临时存放文件的内存大小,这里是4K,多余的部分将临时存在硬盘  
  36.         dfif.setRepository(new File(request.getRealPath("/")+"uploadFiles"));  
  37.         ServletFileUpload sfu = new ServletFileUpload(dfif);//用以上工厂实例化上传组件  
  38.         sfu.setSizeMax(5*1024*1024);//设置最大上传大小  
  39.         List fileList = null;//从list得到所有上传域的列表  
  40.         try{  
  41.             fileList = sfu.parseRequest(request);  
  42.         }catch(FileUploadException e){//处理文件尺寸过大异常  
  43.             if(e instanceof SizeLimitExceededException){  
  44.                 out.println("文件尺寸超过规定大小:"+MAX_SIZE+"字节<p/>");  
  45.                 out.println("<a href=\"index.jsp\" target=\"_top\">返回</a>");  
  46.                 return;  
  47.             }  
  48.          return;  
  49.         }  
  50.         Iterator fileItr = fileList.iterator();//得到所有上传的文件  
  51.         while(fileItr.hasNext()){//循环处理所有文件  
  52.             FileItem fileItem = null;  
  53.             String path = null;  
  54.             long size = 0;  
  55.             fileItem = (FileItem)fileItr.next();//得到当前文件  
  56.             if(fileItem==null||fileItem.isFormField()){//忽略见到form字段,如<input type='text'>  
  57.                 continue;  
  58.             }  
  59.             path = fileItem.getName();//得到文件的完整路径  
  60.             size = fileItem.getSize();//得到文件大小  
  61.             if("".equals(path)||size==0){  
  62.                 out.println("请选择上传文件<p/>");  
  63.                 out.println("<a href='index.jsp'>返回</a>");  
  64.                 return;  
  65.             }  
  66.             String t_name = path.substring(path.lastIndexOf("\\")+1);//得到取出路径的文件名  
  67.             String t_ext = t_name.substring(t_name.lastIndexOf(".")+1);//得到文件的扩展名(无扩展名是将得到全名)  
  68.             int allowFlag = 0;//拒绝接受规定文件格式外的文件类型  
  69.             int allowedExtCount = allowedExt.length;//规定的文件类型的个数  
  70.             for(;allowFlag<allowedExtCount;allowFlag++){  
  71.                 if(allowedExt[allowFlag].equals(t_ext))  
  72.                     break;  
  73.             }  
  74.             if(allowFlag == allowedExtCount){//文件类型不符和规定  
  75.                 out.println("请上传一下类型的文件<p/>");  
  76.                 for(allowFlag=0;allowFlag<allowedExtCount;allowFlag++){  
  77.                     out.println("*."+allowedExt[allowFlag]+"         ");  
  78.                     out.println("<p/><a href=\"index.jsp\">返回</a>");  
  79.                     return;  
  80.                 }  
  81.                 long now = System.currentTimeMillis();//根据系统时间生成上传后保存的文件名  
  82.                 String prefix = String.valueOf(now);  
  83.                 String filename = prefix+","+t_ext;  
  84.                 try{  
  85.                     fileItem.write(new File(request.getRealPath("/")+"uploadFiles"));  
  86.                     System.out.println("OK");  
  87.                 }catch(Exception e){  
  88.                     e.printStackTrace();  
  89.                 }  
  90.             }  
  91.         }  
  92.     }  
  93. }  


一般情况下表单中还会有普通空间(例如文本框等),此时可以在if(fileItem==null||fileItem.isFormField()){//忽略见到form字段,如<input type='text'>continue;}中通过fileIem。getString("gb2312"),得到表单的值。


你可能感兴趣的:(common-fileupload实例(表单含有普通域和文件域))