【servlet】文件上传

来源:互联网 发布:五音不全唱歌的软件 编辑:程序博客网 时间:2024/06/15 03:06
  • 实现web开发中的文件上传功能,需完成如下二步操作:
    1. 在web页面中添加上传输入项
    2. 在servlet中读取上传文件的数据,并保存到本地硬盘中。
  • 如何在web页面中添加上传输入项?
    • <input type=“file”>标签用于在web页面中添加文件上传输入项,设置文件上传输入项时须注意:
      1. 必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。
      2. 必须把form的enctype属值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

upload.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  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 JSP 'upload.jsp' starting page</title>  
  13.       
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <!-- 
  20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  21.     -->  
  22.   
  23.   </head>  
  24.     
  25.   <body>  
  26.     <form action="UploadServlet" enctype="multipart/form-data" method="post">  
  27.        <input type="text" name="username"><br/>  
  28.        <input type="file" name="file1"><br/>  
  29.        <input type="file" name = "file2"><br/>  
  30.        <input type="submit" value="上传文件">  
  31.   
  32.     </form>  
  33.   </body>  
  34. </html>  


UploadServlet.java

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  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 JSP 'upload.jsp' starting page</title>  
  13.       
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <!--  
  20.     <link rel="stylesheet" type="text/css" href="styles.css">  
  21.     -->  
  22.   
  23.   </head>  
  24.     
  25.   <body>  
  26.     <form action="UploadServlet" enctype="multipart/form-data" method="post">  
  27.        <input type="text" name="username"><br/>  
  28.        <input type="file" name="file1"><br/>  
  29.        <input type="file" name = "file2"><br/>  
  30.        <input type="submit" value="上传文件">  
  31.   
  32.     </form>  
  33.   </body>  
  34. </html>  



  • 如何在Servlet中读取文件上传数据,并保存到本地硬盘中?
    • Request对象提供了一个getInputStream方法,读取到客户端提交过来的数据。

      upload.jsp

      1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
      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 JSP 'upload.jsp' starting page</title>  
      13.       
      14.     <meta http-equiv="pragma" content="no-cache">  
      15.     <meta http-equiv="cache-control" content="no-cache">  
      16.     <meta http-equiv="expires" content="0">      
      17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
      18.     <meta http-equiv="description" content="This is my page">  
      19.     <!-- 
      20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
      21.     -->  
      22.   
      23.   </head>  
      24.     
      25.   <body>  
      26.     <form action="UploadServlet" enctype="multipart/form-data" method="post">  
      27.        <input type="text" name="username"><br/>  
      28.        <input type="file" name="file1"><br/>  
      29.        <input type="file" name = "file2"><br/>  
      30.        <input type="submit" value="上传文件">  
      31.   
      32.     </form>  
      33.   </body>  
      34. </html>  

      UploadServlet.java

      1. <p>  
      2. package com.hbsi.servlet;</p>  
      3.   
      4. import java.io.FileOutputStream;  
      5. import java.io.IOException;  
      6. import java.io.InputStream;  
      7. import java.io.PrintWriter;  
      8. import java.util.List;  
      9.   
      10.   
      11. import javax.servlet.ServletException;  
      12. import javax.servlet.http.HttpServlet;  
      13. import javax.servlet.http.HttpServletRequest;  
      14. import javax.servlet.http.HttpServletResponse;  
      15. import javax.swing.filechooser.FileNameExtensionFilter;  
      16.   
      17.   
      18. import org.apache.commons.fileupload.FileItem;  
      19. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
      20. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
      21.   
      22.   
      23. public class UploadServlet extends HttpServlet {  
      24. <span style="white-space:pre">  </span>public void doGet(HttpServletRequest request, HttpServletResponse response)  
      25. <span style="white-space:pre">          </span>throws ServletException, IOException {  
      26. <span style="white-space:pre">      </span>//获取元素  
      27. <span style="white-space:pre">      </span>//不适用传统方式  
      28. <span style="white-space:pre">      </span>System.out.println(request.getParameter("username"));  
      29. <span style="white-space:pre">      </span>//Request对象提供了一个getInputStream方法,读取到客户端提交过来的数据  
      30. <span style="white-space:pre">      </span>InputStream in = request.getInputStream();  
      31. <span style="white-space:pre">      </span>byte[] buf = new byte[1024];  
      32. <span style="white-space:pre">      </span>int len=0;  
      33. <span style="white-space:pre">      </span>while((len=in.read(buf))>0){  
      34. <span style="white-space:pre">          </span>System.out.println(new String(buf,0,len));  
      35. <span style="white-space:pre">      </span>}  
      36. <span style="white-space:pre">  </span>}  
      37.   
      38.   
      39. <span style="white-space:pre">  </span>public void doPost(HttpServletRequest request, HttpServletResponse response)  
      40. <span style="white-space:pre">          </span>throws ServletException, IOException {  
      41. <span style="white-space:pre">      </span>doGet(request, response);  
      42. <span style="white-space:pre">  </span>}  
      43.   
      44.   
      45. }  
                                           
    • 但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作。


Commons-fileupload

  • 为方便用户处理文件上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。
    • 使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包
    • Commons-fileupload和commons-io
      • commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。

fileupload组件工作流程


  •  一点上传,所有请求信息封装在request封装对象里,想用fileupload组件进行上传
    1. 获取工厂解析器DiskFileItemFactory
    2. 从工厂里获取解析器,ServletFileupLoad
    3. 将请求传入解析器,对请求进行解析,调用parseRequest()方法
    4. 迭代list集合,得到每个输入项的数据
    5. 判断item的类型
    • 代表普通字段的FileItem
      • isFormField
      • getFieldName
      • getString
    • 代表上传文件FileItem
      • getInputStream
      • getName

核心API—DiskFileItemFactory

  • DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:
    • public void setSizeThreshold(int sizeThreshold) :设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓存上传文件。
    • public void setRepository(java.io.File repository) :指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").
    • public DiskFileItemFactory(int sizeThreshold, java.io.File repository) :构造函数


核心API—ServletFileUpload

  • ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:
    • boolean isMultipartContent(HttpServletRequest request) :判断上传表单是否为multipart/form-data类型
    • List parseRequest(HttpServletRequest request):解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。 
    • setFileSizeMax(long fileSizeMax) :设置上传文件的最大值
    • setSizeMax(long sizeMax) :设置上传文件总量的最大值
    • setHeaderEncoding(java.lang.String encoding) :设置编码格式
    • setProgressListener(ProgressListener pListener) 


【实例】把文件上传到本地硬盘
实现步骤
1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。
3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值
为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。
编码实现文件上传

upload.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  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 JSP 'upload.jsp' starting page</title>  
  13.       
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <!-- 
  20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  21.     -->  
  22.   
  23.   </head>  
  24.     
  25.   <body>  
  26.     <form action="UploadServlet" enctype="multipart/form-data" method="post">  
  27.        <input type="text" name="username"><br/>  
  28.        <input type="file" name="file1"><br/>  
  29.        <input type="file" name = "file2"><br/>  
  30.        <input type="submit" value="上传文件">  
  31.   
  32.     </form>  
  33.   </body>  
  34. </html>  


UploadServlet.java

  1. package com.hbsi.servlet;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.PrintWriter;  
  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. import javax.swing.filechooser.FileNameExtensionFilter;  
  14.   
  15. import org.apache.commons.fileupload.FileItem;  
  16. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  17. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  18.   
  19. public class UploadServlet extends HttpServlet {  
  20.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  21.             throws ServletException, IOException {  
  22.         /* 
  23.         //获取元素 
  24.         //不适用传统方式 
  25.         System.out.println(request.getParameter("username")); 
  26.         //Request对象提供了一个getInputStream方法,读取到客户端提交过来的数据 
  27.         InputStream in = request.getInputStream(); 
  28.         byte[] buf = new byte[1024]; 
  29.         int len=0; 
  30.         while((len=in.read(buf))>0){ 
  31.             System.out.println(new String(buf,0,len)); 
  32.         }*/  
  33.           
  34.         try{  
  35.             //1.创建一个解析器工厂  
  36.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  37.               
  38.             //2.得到一个解析器  
  39.             ServletFileUpload upload = new ServletFileUpload(factory);  
  40.             upload.setHeaderEncoding("UTF-8");  
  41.               
  42.               
  43.             //3.将请求传入解析器,对请求进行解析  
  44.             List<FileItem> list = upload.parseRequest(request);  
  45.               
  46.             //4.迭代list集合,得到每个输入项的数据  
  47.             for(FileItem item : list){  
  48.                 //5.判断item的类型  
  49.                 if(item.isFormField()){  
  50.                     //普通输入项  
  51.                     String inputName = item.getFieldName();               
  52.                     String inputValue = item.getString();     
  53.                     System.out.println(inputName+"="+inputValue);  
  54.                       
  55.                 }else{  
  56.                     //上传输入项  
  57.                     String fileName = item.getName(); //获取到上传文件的文件名  浏览器不一样,获取的路径不一样,例如aa.txt  c:\aaa\aa.txt  
  58.                     //处理浏览器取值不一样  
  59.                     fileName = fileName.substring(fileName.lastIndexOf("\\")+1);  
  60.                     InputStream in = item.getInputStream();  
  61.                     FileOutputStream out = new FileOutputStream("d:\\"+fileName);  
  62.                     byte[] buf = new byte[1024];  
  63.                     int len=0;  
  64.                     while((len=in.read(buf))>0){  
  65.                         out.write(buf,0,len);  
  66.                     }  
  67.                     in.close();  
  68.                     out.close();  
  69.                 }  
  70.                 request.setAttribute("message","上传成功");  
  71.             }  
  72.             }catch (Exception e) {  
  73.                 e.printStackTrace();  
  74.                 request.setAttribute("message""上传失败");  
  75.             }  
  76.             request.getRequestDispatcher("/upload/message.jsp").forward(request, response);  
  77.     }  
  78.   
  79.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  80.             throws ServletException, IOException {  
  81.         doGet(request, response);  
  82.     }  
  83.   
  84. }  


message.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  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 JSP 'message.jsp' starting page</title>  
  13.       
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <!-- 
  20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  21.     -->  
  22.   
  23.   </head>  
  24.     
  25.   <body>  
  26.     ${message } <br>  
  27.   </body>  
  28. </html>  


上传图片:




中文文件乱码问题

上传文件名是中文:

upload.setHeaderEncoding("UTF-8");
  • 文件名中文乱码问题,可调用ServletUpLoader的setHeaderEncoding方法,或者设置request的setCharacterEncoding属性 


若用上个案例的方法上传中文文件,效果如下



修改UploadServlet.java,在得到解析器后面

  1. package com.hbsi.servlet;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.PrintWriter;  
  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. import javax.swing.filechooser.FileNameExtensionFilter;  
  14.   
  15. import org.apache.commons.fileupload.FileItem;  
  16. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  17. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  18.   
  19. public class UploadServlet extends HttpServlet {  
  20.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  21.             throws ServletException, IOException {  
  22.         /* 
  23.         //获取元素 
  24.         //不适用传统方式 
  25.         System.out.println(request.getParameter("username")); 
  26.         //Request对象提供了一个getInputStream方法,读取到客户端提交过来的数据 
  27.         InputStream in = request.getInputStream(); 
  28.         byte[] buf = new byte[1024]; 
  29.         int len=0; 
  30.         while((len=in.read(buf))>0){ 
  31.             System.out.println(new String(buf,0,len)); 
  32.         }*/  
  33.           
  34.         try{  
  35.             //1.创建一个解析器工厂  
  36.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  37.               
  38.             //2.得到一个解析器  
  39.             ServletFileUpload upload = new ServletFileUpload(factory);  
  40.             //和jsp页面编码一致就好  
  41.             upload.setHeaderEncoding("UTF-8");  
  42.               
  43.               
  44.             //3.将请求传入解析器,对请求进行解析  
  45.             List<FileItem> list = upload.parseRequest(request);  
  46.               
  47.             //4.迭代list集合,得到每个输入项的数据  
  48.             for(FileItem item : list){  
  49.                 //5.判断item的类型  
  50.                 if(item.isFormField()){  
  51.                     //普通输入项  
  52.                     String inputName = item.getFieldName();               
  53.                     String inputValue = item.getString();     
  54.                     System.out.println(inputName+"="+inputValue);  
  55.                       
  56.                 }else{  
  57.                     //上传输入项  
  58.                     String fileName = item.getName(); //获取到上传文件的文件名  浏览器不一样,获取的路径不一样,例如aa.txt  c:\aaa\aa.txt  
  59.                     //处理浏览器取值不一样  
  60.                     fileName = fileName.substring(fileName.lastIndexOf("\\")+1);  
  61.                     InputStream in = item.getInputStream();  
  62.                     FileOutputStream out = new FileOutputStream("d:\\"+fileName);  
  63.                     byte[] buf = new byte[1024];  
  64.                     int len=0;  
  65.                     while((len=in.read(buf))>0){  
  66.                         out.write(buf,0,len);  
  67.                     }  
  68.                     in.close();  
  69.                     out.close();  
  70.                 }  
  71.                 request.setAttribute("message","上传成功");  
  72.             }  
  73.             }catch (Exception e) {  
  74.                 e.printStackTrace();  
  75.                 request.setAttribute("message""上传失败");  
  76.             }  
  77.             request.getRequestDispatcher("/upload/message.jsp").forward(request, response);  
  78.     }  
  79.   
  80.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  81.             throws ServletException, IOException {  
  82.         doGet(request, response);  
  83.     }  
  84.   
  85. }  

如果上传的是普通输入项,中文处理:

  手工编码:inputValue = new String(inputValue.getBytes("iso8859-1"),"UTF-8");
  通过getString():  String inputValue = item.getString("UTF-8");

若用上个案例的方法上传中文文件,效果如下






修改UploadServlet.java,在普通输入项后面

  1. package com.hbsi.servlet;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.PrintWriter;  
  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. import javax.swing.filechooser.FileNameExtensionFilter;  
  14.   
  15. import org.apache.commons.fileupload.FileItem;  
  16. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  17. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  18.   
  19. public class UploadServlet extends HttpServlet {  
  20.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  21.             throws ServletException, IOException {  
  22.         /* 
  23.         //获取元素 
  24.         //不适用传统方式 
  25.         System.out.println(request.getParameter("username")); 
  26.         //Request对象提供了一个getInputStream方法,读取到客户端提交过来的数据 
  27.         InputStream in = request.getInputStream(); 
  28.         byte[] buf = new byte[1024]; 
  29.         int len=0; 
  30.         while((len=in.read(buf))>0){ 
  31.             System.out.println(new String(buf,0,len)); 
  32.         }*/  
  33.           
  34.         try{  
  35.             //1.创建一个解析器工厂  
  36.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  37.               
  38.             //2.得到一个解析器  
  39.             ServletFileUpload upload = new ServletFileUpload(factory);  
  40.             //和jsp页面编码一致就好  
  41.             upload.setHeaderEncoding("UTF-8");  
  42.               
  43.               
  44.             //3.将请求传入解析器,对请求进行解析  
  45.             List<FileItem> list = upload.parseRequest(request);  
  46.               
  47.             //4.迭代list集合,得到每个输入项的数据  
  48.             for(FileItem item : list){  
  49.                 //5.判断item的类型  
  50.                 if(item.isFormField()){  
  51.                     //普通输入项  
  52.                     String inputName = item.getFieldName();   
  53.                       
  54.                     //如果上传的是普通输入项,中文处理:  
  55.                     //1.手工编码  
  56.                     //String inputValue = item.getString();  
  57.                     //inputValue = new String(inputValue.getBytes("iso8859-1"),"UTF-8");  
  58.                     //2.通过getString()  
  59.                     String inputValue = item.getString("UTF-8");      
  60.                     System.out.println(inputName+"="+inputValue);  
  61.                       
  62.                       
  63.                 }else{  
  64.                     //上传输入项  
  65.                     String fileName = item.getName(); //获取到上传文件的文件名  浏览器不一样,获取的路径不一样,例如aa.txt  c:\aaa\aa.txt  
  66.                     //处理浏览器取值不一样  
  67.                     fileName = fileName.substring(fileName.lastIndexOf("\\")+1);  
  68.                     InputStream in = item.getInputStream();  
  69.                     FileOutputStream out = new FileOutputStream("d:\\"+fileName);  
  70.                     byte[] buf = new byte[1024];  
  71.                     int len=0;  
  72.                     while((len=in.read(buf))>0){  
  73.                         out.write(buf,0,len);  
  74.                     }  
  75.                     in.close();  
  76.                     out.close();  
  77.                 }  
  78.                 request.setAttribute("message","上传成功");  
  79.             }  
  80.             }catch (Exception e) {  
  81.                 e.printStackTrace();  
  82.                 request.setAttribute("message""上传失败");  
  83.             }  
  84.             request.getRequestDispatcher("/upload/message.jsp").forward(request, response);  
  85.     }  
  86.   
  87.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  88.             throws ServletException, IOException {  
  89.         doGet(request, response);  
  90.     }  
  91.   
  92. }  




如果没有填写第二个的输入项

if(!fileName.equals("")){  。。。。 }

若用上个案例的方法上传中文文件,效果如下


修改UploadServlet.java,在else后面

  1. package com.hbsi.servlet;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.PrintWriter;  
  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. import javax.swing.filechooser.FileNameExtensionFilter;  
  14.   
  15. import org.apache.commons.fileupload.FileItem;  
  16. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  17. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  18.   
  19. public class UploadServlet extends HttpServlet {  
  20.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  21.             throws ServletException, IOException {  
  22.         /* 
  23.          * //获取元素 //不适用传统方式 
  24.          * System.out.println(request.getParameter("username")); 
  25.          * //Request对象提供了一个getInputStream方法,读取到客户端提交过来的数据 InputStream in = 
  26.          * request.getInputStream(); byte[] buf = new byte[1024]; int len=0; 
  27.          * while((len=in.read(buf))>0){ System.out.println(new 
  28.          * String(buf,0,len)); } 
  29.          */  
  30.   
  31.         try {  
  32.             // 1.创建一个解析器工厂  
  33.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  34.   
  35.             // 2.得到一个解析器  
  36.             ServletFileUpload upload = new ServletFileUpload(factory);  
  37.             // 和jsp页面编码一致就好  
  38.             upload.setHeaderEncoding("UTF-8");  
  39.   
  40.             // 3.将请求传入解析器,对请求进行解析  
  41.             List<FileItem> list = upload.parseRequest(request);  
  42.   
  43.             // 4.迭代list集合,得到每个输入项的数据  
  44.             for (FileItem item : list) {  
  45.                 // 5.判断item的类型  
  46.                 if (item.isFormField()) {  
  47.                     // 普通输入项  
  48.                     String inputName = item.getFieldName();  
  49.   
  50.                     // 如果上传的是普通输入项,中文处理:  
  51.                     // 1.手工编码  
  52.                     // String inputValue = item.getString();  
  53.                     // inputValue = new  
  54.                     // String(inputValue.getBytes("iso8859-1"),"UTF-8");  
  55.                     // 2.通过getString()  
  56.                     String inputValue = item.getString("UTF-8");  
  57.                     System.out.println(inputName + "=" + inputValue);  
  58.   
  59.                 } else {  
  60.                     // 上传输入项  
  61.                     String fileName = item.getName(); // 获取到上传文件的文件名  
  62.                                                         // 浏览器不一样,获取的路径不一样,例如aa.txt  
  63.                                                         // c:\aaa\aa.txt  
  64.                     if (!fileName.equals("")) {  
  65.                         // 处理浏览器取值不一样  
  66.                         fileName = fileName.substring(fileName  
  67.                                 .lastIndexOf("\\") + 1);  
  68.                         InputStream in = item.getInputStream();  
  69.                         FileOutputStream out = new FileOutputStream("d:\\"  
  70.                                 + fileName);  
  71.                         byte[] buf = new byte[1024];  
  72.                         int len = 0;  
  73.                         while ((len = in.read(buf)) > 0) {  
  74.                             out.write(buf, 0, len);  
  75.                         }  
  76.                         in.close();  
  77.                         out.close();  
  78.                     }  
  79.                 }  
  80.                 request.setAttribute("message""上传成功");  
  81.             }  
  82.         } catch (Exception e) {  
  83.             e.printStackTrace();  
  84.             request.setAttribute("message""上传失败");  
  85.         }  
  86.         request.getRequestDispatcher("/upload/message.jsp").forward(request,  
  87.                 response);  
  88.     }  
  89.   
  90.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  91.             throws ServletException, IOException {  
  92.         doGet(request, response);  
  93.     }  
  94.   
  95. }  



删除临时文件

item.delete(); //删除item对应临时文件
  • 由于文件大小超出DiskFileItemFactory.setSizeThreshold方法设置的内存缓冲区的大小时,Commons-fileupload组件将使用临时文件保存上传数据,因此在程序结束时,务必调用FileItem.delete方法删除临时文件。
  • Delete方法的调用必须位于流关闭之后,否则会出现文件占用,而导致删除失败的情况。


WebRoot下新建文件夹temp

在创建工厂前加临时文件

  1. package com.hbsi.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.PrintWriter;  
  8. import java.util.List;  
  9.   
  10. import javax.servlet.ServletException;  
  11. import javax.servlet.http.HttpServlet;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14. import javax.swing.filechooser.FileNameExtensionFilter;  
  15.   
  16. import org.apache.commons.fileupload.FileItem;  
  17. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  18. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  19.   
  20. public class UploadServlet extends HttpServlet {  
  21.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  22.             throws ServletException, IOException {  
  23.         /* 
  24.          * //获取元素 //不适用传统方式 
  25.          * System.out.println(request.getParameter("username")); 
  26.          * //Request对象提供了一个getInputStream方法,读取到客户端提交过来的数据 InputStream in = 
  27.          * request.getInputStream(); byte[] buf = new byte[1024]; int len=0; 
  28.          * while((len=in.read(buf))>0){ System.out.println(new 
  29.          * String(buf,0,len)); } 
  30.          */  
  31.   
  32.         try {  
  33.             // 1.创建一个解析器工厂  
  34.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  35.             String tempPath = this.getServletContext().getRealPath("/temp");  
  36.             factory.setRepository(new File(tempPath));  
  37.   
  38.             // 2.得到一个解析器  
  39.             ServletFileUpload upload = new ServletFileUpload(factory);  
  40.             // 和jsp页面编码一致就好  
  41.             upload.setHeaderEncoding("UTF-8");  
  42.   
  43.             // 3.将请求传入解析器,对请求进行解析  
  44.             List<FileItem> list = upload.parseRequest(request);  
  45.   
  46.             // 4.迭代list集合,得到每个输入项的数据  
  47.             for (FileItem item : list) {  
  48.                 // 5.判断item的类型  
  49.                 if (item.isFormField()) {  
  50.                     // 普通输入项  
  51.                     String inputName = item.getFieldName();  
  52.   
  53.                     // 如果上传的是普通输入项,中文处理:  
  54.                     // 1.手工编码  
  55.                     // String inputValue = item.getString();  
  56.                     // inputValue = new  
  57.                     // String(inputValue.getBytes("iso8859-1"),"UTF-8");  
  58.                     // 2.通过getString()  
  59.                     String inputValue = item.getString("UTF-8");  
  60.                     System.out.println(inputName + "=" + inputValue);  
  61.   
  62.                 } else {  
  63.                     // 上传输入项  
  64.                     String fileName = item.getName(); // 获取到上传文件的文件名  
  65.                                                         // 浏览器不一样,获取的路径不一样,例如aa.txt  
  66.                                                         // c:\aaa\aa.txt  
  67.                     if (!fileName.equals("")) {  
  68.                         // 处理浏览器取值不一样  
  69.                         fileName = fileName.substring(fileName  
  70.                                 .lastIndexOf("\\") + 1);  
  71.                         InputStream in = item.getInputStream();  
  72.                         FileOutputStream out = new FileOutputStream("d:\\"  
  73.                                 + fileName);  
  74.                         byte[] buf = new byte[1024];  
  75.                         int len = 0;  
  76.                         while ((len = in.read(buf)) > 0) {  
  77.                             out.write(buf, 0, len);  
  78.                         }  
  79.                         in.close();  
  80.                         out.close();  
  81.                     }  
  82.                 }  
  83.                 request.setAttribute("message""上传成功");  
  84.             }  
  85.         } catch (Exception e) {  
  86.             e.printStackTrace();  
  87.             request.setAttribute("message""上传失败");  
  88.         }  
  89.         request.getRequestDispatcher("/upload/message.jsp").forward(request,  
  90.                 response);  
  91.     }  
  92.   
  93.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  94.             throws ServletException, IOException {  
  95.         doGet(request, response);  
  96.     }  
  97.   
  98. }  


删除临时文件:

在关闭后添加delete方法

  1. package com.hbsi.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.PrintWriter;  
  8. import java.util.List;  
  9.   
  10. import javax.servlet.ServletException;  
  11. import javax.servlet.http.HttpServlet;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14. import javax.swing.filechooser.FileNameExtensionFilter;  
  15.   
  16. import org.apache.commons.fileupload.FileItem;  
  17. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  18. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  19.   
  20. public class UploadServlet extends HttpServlet {  
  21.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  22.             throws ServletException, IOException {  
  23.         /* 
  24.          * //获取元素 //不适用传统方式 
  25.          * System.out.println(request.getParameter("username")); 
  26.          * //Request对象提供了一个getInputStream方法,读取到客户端提交过来的数据 InputStream in = 
  27.          * request.getInputStream(); byte[] buf = new byte[1024]; int len=0; 
  28.          * while((len=in.read(buf))>0){ System.out.println(new 
  29.          * String(buf,0,len)); } 
  30.          */  
  31.   
  32.         try {  
  33.             // 1.创建一个解析器工厂  
  34.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  35.             String tempPath = this.getServletContext().getRealPath("/temp");  
  36.             factory.setRepository(new File(tempPath));  
  37.   
  38.             // 2.得到一个解析器  
  39.             ServletFileUpload upload = new ServletFileUpload(factory);  
  40.             // 和jsp页面编码一致就好  
  41.             upload.setHeaderEncoding("UTF-8");  
  42.   
  43.             // 3.将请求传入解析器,对请求进行解析  
  44.             List<FileItem> list = upload.parseRequest(request);  
  45.   
  46.             // 4.迭代list集合,得到每个输入项的数据  
  47.             for (FileItem item : list) {  
  48.                 // 5.判断item的类型  
  49.                 if (item.isFormField()) {  
  50.                     // 普通输入项  
  51.                     String inputName = item.getFieldName();  
  52.   
  53.                     // 如果上传的是普通输入项,中文处理:  
  54.                     // 1.手工编码  
  55.                     // String inputValue = item.getString();  
  56.                     // inputValue = new  
  57.                     // String(inputValue.getBytes("iso8859-1"),"UTF-8");  
  58.                     // 2.通过getString()  
  59.                     String inputValue = item.getString("UTF-8");  
  60.                     System.out.println(inputName + "=" + inputValue);  
  61.   
  62.                 } else {  
  63.                     // 上传输入项  
  64.                     String fileName = item.getName(); // 获取到上传文件的文件名  
  65.                                                         // 浏览器不一样,获取的路径不一样,例如aa.txt  
  66.                                                         // c:\aaa\aa.txt  
  67.                     if (!fileName.equals("")) {  
  68.                         // 处理浏览器取值不一样  
  69.                         fileName = fileName.substring(fileName  
  70.                                 .lastIndexOf("\\") + 1);  
  71.                         InputStream in = item.getInputStream();  
  72.                         FileOutputStream out = new FileOutputStream("d:\\"  
  73.                                 + fileName);  
  74.                         byte[] buf = new byte[1024];  
  75.                         int len = 0;  
  76.                         while ((len = in.read(buf)) > 0) {  
  77.                             out.write(buf, 0, len);  
  78.                         }  
  79.                         in.close();  
  80.                         out.close();  
  81.                         item.delete(); //删除item对应临时文件  
  82.                     }  
  83.                 }  
  84.                 request.setAttribute("message""上传成功");  
  85.             }  
  86.         } catch (Exception e) {  
  87.             e.printStackTrace();  
  88.             request.setAttribute("message""上传失败");  
  89.         }  
  90.         request.getRequestDispatcher("/upload/message.jsp").forward(request,  
  91.                 response);  
  92.     }  
  93.   
  94.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  95.             throws ServletException, IOException {  
  96.         doGet(request, response);  
  97.     }  
  98.   
  99. }