1. import javax.servlet.*;  

  2. import javax.servlet.http.*;  

  3. import java.io.*;  

  4. import java.util.*;  

  5. import org.apache.commons.fileupload.*;  

  6. import org.apache.commons.fileupload.servlet.*;  

  7. import org.apache.commons.fileupload.disk.*;  



  8. publicclass UploadServlet extends HttpServlet  

  9. {  

  10. private String filePath;    // 文件存放

  11. private String tempPath;    // 临时文件

  12. // 初始化

  13. publicvoid init(ServletConfig config) throws ServletException  

  14.    {  

  15. super.init(config);  

  16.        filePath = config.getInitParameter("filepath");  

  17.        tempPath = config.getInitParameter("temppath");  

  18.        ServletContext context = getServletContext();  

  19.        filePath = context.getRealPath(filePath);  

  20.        tempPath = context.getRealPath(tempPath);  



  21.    }  

  22. // doPost

  23. publicvoid doPost(HttpServletRequest req, HttpServletResponse res)  

  24. throws IOException, ServletException  

  25.    {  

  26.        res.setContentType("text/plain;charset=gbk");  

  27.        PrintWriter pw = res.getWriter();  

  28. try{  

  29.            DiskFileItemFactory diskFactory = newDiskFileItemFactory();  

  30. // threshold 极限、临界值,即硬盘缓存 1M

  31.            diskFactory.setSizeThreshold(4 * 1024);  

  32. // repository 贮藏室,即临时文件目录

  33.            diskFactory.setRepository(new File(tempPath));  

  34.            ServletFileUpload upload = new ServletFileUpload(diskFactory);

  35. // 设置允许上传的最大文件大小 4M

  36.            upload.setSizeMax(4 * 1024 * 1024);  

  37. // 解析HTTP请求消息头

  38.            List fileItems = upload.parseRequest(req);  

  39.            Iterator iter = fileItems.iterator();  

  40. while(iter.hasNext())  

  41.            {  

  42.                FileItem item = (FileItem)iter.next();  

  43. if(item.isFormField())  

  44.                {  

  45.                    System.out.println("处理表单内容 ...");  

  46.                    processFormField(item, pw);  

  47.                }else{  

  48.                    System.out.println("处理上传的文件 ...");  

  49.                    processUploadFile(item, pw);  

  50.                }  

  51.            }// end while()

  52.            pw.close();  

  53.        }catch(Exception e){  

  54.            System.out.println("使用 fileupload 包时发生异常 ...");  

  55.            e.printStackTrace();  

  56.        }// end try ... catch ...

  57.    }// end doPost()

  58. // 处理表单内容

  59. privatevoid processFormField(FileItem item, PrintWriter pw)  

  60. throws Exception  

  61.    {  

  62.        String name = item.getFieldName();  

  63.        String value = item.getString();          

  64.        pw.println(name + " : " + value + "\r\n");  

  65.    }  

  66. // 处理上传的文件

  67. privatevoid processUploadFile(FileItem item, PrintWriter pw)  

  68. throws Exception  

  69.    {  

  70. // 此时的文件名包含了完整的路径,得注意加工一下

  71.        String filename = item.getName();        

  72.        System.out.println("完整的文件名:" + filename);  

  73. int index = filename.lastIndexOf("\\");  

  74.        filename = filename.substring(index + 1, filename.length());  

  75. long fileSize = item.getSize();  

  76. if("".equals(filename) && fileSize == 0)  

  77.        {            

  78.            System.out.println("文件名为空 ...");  

  79. return;  

  80.        }  

  81.        File uploadFile = new File(filePath + "/" + filename);  

  82. item.write(uploadFile);

  83.        pw.println(filename + " 文件保存完毕 ...");  

  84.        pw.println("文件大小为 :" + fileSize + "\r\n");  

  85.    }  

  86. // doGet

  87. publicvoid doGet(HttpServletRequest req, HttpServletResponse res)  

  88. throws IOException, ServletException  

  89.    {  

  90.        doPost(req, res);  

  91.    }  

  92. }

web.xml 文件

 
  
  1. <?xmlversion="1.0"encoding="gb2312"?>

  2. <web-appxmlns="http://java.sun.com/xml/ns/j2ee"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

  5. version="2.4">

  6. <servlet>

  7. <servlet-name>UploadServlet</servlet-name>

  8. <servlet-class>UploadServlet</servlet-class>

  9. <init-param>

  10. <param-name>filepath</param-name>

  11. <param-value>uploadFile</param-value>

  12. </init-param>

  13. <init-param>

  14. <param-name>temppath</param-name>

  15. <param-value>temp</param-value>

  16. </init-param>

  17. </servlet>

  18. <servlet-mapping>

  19. <servlet-name>UploadServlet</servlet-name>

  20. <url-pattern>/upload</url-pattern>

  21. </servlet-mapping>

  22. </web-app>

程序运行过程截图:(在 web.xml 文件中我们把UploadServlet 映射为 upload

1、启动 Tomcat ,在浏览器输入 URL 并填写 HTML 表单,如下:

uploadServlet01

2、点击“上传”,发出一个包含了上传文件的复杂 HTTP 请求,由 UploadServlet 进行处理:

先看下 Tomcat 的控制台输出信息:

uploadServlet02

再看一下浏览器的相应输出:

uploadServlet03

最后看上传的文件是否被被保存在指定的目录中:

uploadServlet04

嗯,文件目录和文件保存时间都正确,就是文件大小忘了转化一下…(*^__^*) …

小结:

1、使用开源的 fileupload 包为我们在 UploadServlet 代码中显式地用繁杂的 request.getParameter(“username”) 语句来获取 HTTP 请求所包含的表单值;

2、而且还省去了我们在 UploadServlet 中自己编写判断表单是否是文件或文本类型的代码;

3、更重要的是,FileItem 对象的响应方法可以使得我们轻松地获取文件名、文件大小、路径等等;

4、最重要的是,使用 JD-GUI 反编译器简单地看看开源的 fileupload 包中的类组织结构,这更加有意思、有用处,:-D