Java上传文件—FileUpload组件介绍

分类:  Technology2010-06-06 20:57  2754人阅读  评论(5)  收藏  举报

  一般在用Servlet处理表单元素时,表单元素都是一些简单的文本,Servlet很容易用Request.getParameter()就可以处理。但是当表单不止包含一些简单的文本,比如有上传文件域时,Servlet直接从HttpServletRequest对象中解析出复合表单的每一个子部分仍然是一项非常复杂的工作.

  为了简化对“multipart/form-data”类型数据的处理过程,可以采用相应的组件进行处理,这样可以节省很大的编码、支持重用,效率也挺高。

  对于Java的组件也有一些:FileUpload、SmartUpload和Cos等等,本文就以Apache的FileUpload讲解一下。

  要使用FileUpload,首先应下载相应组件:

  1.fileupload软件包:http://commons.apache.org/fileupload/

  2.io软件包:http://commons.apache.org/io/

  下载后解压zip 包,将commons-fileupload-1.2.1.jar和commons-io-1.4.jar 复制到tomcat 的webapp/WEB-INF/lib下。

 

 

一、表单页面(要指定表单的enctype="multipart/form-data")——Upload.html

[xhtml]  view plain copy
  1. <html>  
  2. <head>  
  3. <title>Upload</title>  
  4. </head>  
  5. <body >  
  6.   <form name="uploadForm" method="POST"  
  7.     enctype="MULTIPART/FORM-DATA"  
  8.     action="upload">  
  9.     <table>  
  10.       <tr>  
  11.        <td><div align="right">User Name:</div></td>  
  12.        <td><input type="text" name="username" size="30"/> </td>  
  13.       </tr>  
  14.       <tr>  
  15.        <td><div align="right">Upload File1:</div></td>  
  16.        <td><input type="file" name="file1" size="30"/> </td>  
  17.       </tr>  
  18.       <tr>  
  19.         <td><div align="right">Upload File2:</div></td>  
  20.         <td><input type="file" name="file2" size="30"/> </td>  
  21.       </tr>  
  22.       <tr>  
  23.         <td><input type="submit" name="submit" value="upload"></td>  
  24.         <td><input type="reset" name="reset" value="reset"></td>  
  25.       </tr>  
  26.     </table>  
  27.   </form>  
  28. </body>  
  29. </html>  

 

 

二、处理表单的Servlet——UploadServlet

 

[java]  view plain copy
  1. package mypack;  
  2.   
  3. import javax.servlet.*;  
  4. import javax.servlet.http.*;  
  5. import java.io.*;  
  6. import java.util.*;  
  7. import org.apache.commons.fileupload.*;  
  8. import org.apache.commons.fileupload.servlet.*;  
  9. import org.apache.commons.fileupload.disk.*;  
  10.   
  11. public class UploadServlet extends HttpServlet {  
  12.   private String filePath; //存放上传文件的目录  
  13.   private String tempFilePath; //存放临时文件的目录  
  14.   
  15.   public void init(ServletConfig config)throws ServletException {  
  16.     super.init(config);  
  17.     filePath=config.getInitParameter("filePath");  
  18.     tempFilePath=config.getInitParameter("tempFilePath");  
  19.     filePath=getServletContext().getRealPath(filePath);  
  20.     tempFilePath=getServletContext().getRealPath(tempFilePath);  
  21.   }  
  22.   public void doPost(HttpServletRequest request,HttpServletResponse response)  
  23.          throws ServletException, IOException {  
  24.     response.setContentType("text/plain");  
  25.     //向客户端发送响应正文  
  26.     PrintWriter outNet=response.getWriter();   
  27.     try{  
  28.       //创建一个基于硬盘的FileItem工厂  
  29.       DiskFileItemFactory factory = new DiskFileItemFactory();  
  30.       //设置向硬盘写数据时所用的缓冲区的大小,此处为4K  
  31.       factory.setSizeThreshold(4*1024);   
  32.       //设置临时目录  
  33.       factory.setRepository(new File(tempFilePath));  
  34.   
  35.       //创建一个文件上传处理器  
  36.       ServletFileUpload upload = new ServletFileUpload(factory);  
  37.       //设置允许上传的文件的最大尺寸,此处为4M  
  38.       upload.setSizeMax(4*1024*1024);   
  39.       
  40.       List /* FileItem */ items = upload.parseRequest(request);      
  41.   
  42.       Iterator iter = items.iterator();  
  43.       while (iter.hasNext()) {  
  44.         FileItem item = (FileItem) iter.next();  
  45.         if(item.isFormField()) {  
  46.           processFormField(item,outNet); //处理普通的表单域  
  47.         }else{  
  48.           processUploadedFile(item,outNet); //处理上传文件  
  49.         }  
  50.       }  
  51.       outNet.close();  
  52.     }catch(Exception e){  
  53.        throw new ServletException(e);  
  54.     }  
  55.   }  
  56.   
  57.   private void processFormField(FileItem item,PrintWriter outNet){  
  58.     String name = item.getFieldName();  
  59.     String value = item.getString();  
  60.     outNet.println(name+":"+value+"/r/n");  
  61.   }  
  62.     
  63.     
  64.   private void processUploadedFile(FileItem item,PrintWriter outNet)throws Exception{  
  65.     String filename=item.getName();  
  66.     int index=filename.lastIndexOf("//");  
  67.     filename=filename.substring(index+1,filename.length());  
  68.     long fileSize=item.getSize();  
  69.       
  70.     if(filename.equals("") && fileSize==0)return;  
  71.   
  72.     File uploadedFile = new File(filePath+"/"+filename);  
  73.     item.write(uploadedFile);  
  74.     outNet.println(filename+" is saved.");  
  75.     outNet.println("The size of " +filename+" is "+fileSize+"/r/n");  
  76.   }  
  77. }  

该Servlet在Web.xml中其配置为:

[xhtml]  view plain copy
  1. <servlet>  
  2.     <servlet-name>upload</servlet-name>  
  3.     <servlet-class>mypack.UploadServlet</servlet-class>  
  4.     <init-param>  
  5.       <param-name>filePath</param-name>  
  6.       <param-value>store</param-value>  
  7.     </init-param>  
  8.     <init-param>  
  9.       <param-name>tempFilePath</param-name>  
  10.       <param-value>temp</param-value>  
  11.     </init-param>  
  12.   
  13.   </servlet>  
  14.   
  15.   <servlet-mapping>  
  16.     <servlet-name>upload</servlet-name>  
  17.     <url-pattern>/upload</url-pattern>  
  18.   </servlet-mapping>  

 

  到此已经完成一个简单的上传文件功能了——访问表单页面,选择文件后点击上传文件即可。如果想要在上传文件到服务器的同时,又要将文件保存到数据库中,可以在获取到文件名后,将文件名保存到数据库里,这样以后可以根据文件名把用户的文件选择出来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值