servlet 文件上传

使用 Apache 开源上传软件包 fileupload,在fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象;FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求(即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件;而 ServletFileUpload 对象的创建需要依赖于 FileItemFactory 工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。

upload.html 文件
       
       
  1. <html> 
  2.     <head>  <title>Servlet 上传文件</title></head> 
  3.     <body > 
  4.       <form name="uploadForm" method="POST" 
  5.         enctype="MULTIPART/FORM-DATA" 
  6.         action="upload"> 
  7.  
  8.         User Name:<input type="text" name="username" size="30"/> 
  9.         Upload File1:<input type="file" name="file1" size="30"/> 
  10.         Upload File2:<input type="file" name="file2" size="30"/>   
  11.         <input type="submit" name="submit" value="上传"> 
  12.         <input type="reset" name="reset" value="重置"> 
  13.       </form> 
  14.     </body> 
  15. </html> 
UploadServlet.java 文件
  1. import javax.servlet.http.*;  
  2. import java.io.*;  
  3. import java.util.*;  
  4. import org.apache.commons.fileupload.*;  
  5. import org.apache.commons.fileupload.servlet.*;  
  6. import org.apache.commons.fileupload.disk.*;  
  7.  
  8. // Servlet 文件上传  
  9. public class UploadServlet extends HttpServlet  
  10. {  
  11.     private String filePath;    // 文件存放目录  
  12.     private String tempPath;    // 临时文件目录  
  13.  
  14.     // 初始化  
  15.     public void init(ServletConfig config) throws ServletException  
  16.     {  
  17.         super.init(config);  
  18.         // 从配置文件中获得初始化参数  
  19.         filePath = config.getInitParameter("filepath");  
  20.         tempPath = config.getInitParameter("temppath");  
  21.  
  22.         ServletContext context = getServletContext();  
  23.  
  24.         filePath = context.getRealPath(filePath);  
  25.         tempPath = context.getRealPath(tempPath);  
  26.         System.out.println("文件存放目录、临时文件目录准备完毕 ...");  
  27.     }  
  28.       
  29.     // doPost  
  30.     public void doPost(HttpServletRequest req, HttpServletResponse res)  
  31.         throws IOException, ServletException  
  32.     {  
  33.         res.setContentType("text/plain;charset=gbk");  
  34.         PrintWriter pw = res.getWriter();  
  35.         try{  
  36.             DiskFileItemFactory diskFactory = new DiskFileItemFactory();  
  37.             // threshold 极限、临界值,即硬盘缓存 1M  
  38.             diskFactory.setSizeThreshold(4 * 1024);  
  39.             // repository 贮藏室,即临时文件目录  
  40.             diskFactory.setRepository(new File(tempPath));  
  41.           
  42.             ServletFileUpload upload = new ServletFileUpload(diskFactory);  
  43.             // 设置允许上传的最大文件大小 4M  
  44.             upload.setSizeMax(4 * 1024 * 1024);  
  45.             // 解析HTTP请求消息头  
  46.             List fileItems = upload.parseRequest(req);  
  47.             Iterator iter = fileItems.iterator();  
  48.             while(iter.hasNext())  
  49.             {  
  50.                 FileItem item = (FileItem)iter.next();  
  51.                 if(item.isFormField())  
  52.                 {  
  53.                     System.out.println("处理表单内容 ...");  
  54.                     processFormField(item, pw);  
  55.                 }else{  
  56.                     System.out.println("处理上传的文件 ...");  
  57.                     processUploadFile(item, pw);  
  58.                 }  
  59.             }// end while()  
  60.  
  61.             pw.close();  
  62.         }catch(Exception e){  
  63.             System.out.println("使用 fileupload 包时发生异常 ...");  
  64.             e.printStackTrace();  
  65.         }// end try ... catch ...  
  66.     }// end doPost()  
  67.  
  68.  
  69.     // 处理表单内容  
  70.     private void processFormField(FileItem item, PrintWriter pw)  
  71.         throws Exception  
  72.     {  
  73.         String name = item.getFieldName();  
  74.         String value = item.getString();          
  75.         pw.println(name + " : " + value + "\r\n");  
  76.     }  
  77.       
  78.     // 处理上传的文件  
  79.     private void processUploadFile(FileItem item, PrintWriter pw)  
  80.         throws Exception  
  81.     {  
  82.         // 此时的文件名包含了完整的路径,得注意加工一下  
  83.         String filename = item.getName();         
  84.         System.out.println("完整的文件名:" + filename);  
  85.         int index = filename.lastIndexOf("\\");  
  86.         filename = filename.substring(index + 1, filename.length());  
  87.  
  88.         long fileSize = item.getSize();  
  89.  
  90.         if("".equals(filename) && fileSize == 0)  
  91.         {             
  92.             System.out.println("文件名为空 ...");  
  93.             return;  
  94.         }  
  95.  
  96.         File uploadFile = new File(filePath + "/" + filename);  
  97.         item.write(uploadFile);  
  98.         pw.println(filename + " 文件保存完毕 ...");  
  99.         pw.println("文件大小为 :" + fileSize + "\r\n");  
  100.     }  
  101.       
  102.     // doGet  
  103.     public void doGet(HttpServletRequest req, HttpServletResponse res)  
  104.         throws IOException, ServletException  
  105.     {  
  106.         doPost(req, res);  
  107.     }  
web.xml 文件
  1. <?xml version="1.0" encoding="gb2312"?> 
  2. <web-app xmlns="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.  
  7.     <servlet> 
  8.         <servlet-name>UploadServlet</servlet-name> 
  9.         <servlet-class>UploadServlet</servlet-class> 
  10.  
  11.         <init-param> 
  12.             <param-name>filepath</param-name> 
  13.             <param-value>uploadFile</param-value> 
  14.         </init-param> 
  15.         <init-param> 
  16.             <param-name>temppath</param-name> 
  17.             <param-value>temp</param-value> 
  18.         </init-param> 
  19.     </servlet>      
  20.  
  21.     <servlet-mapping> 
  22.         <servlet-name>UploadServlet</servlet-name> 
  23.         <url-pattern>/upload</url-pattern> 
  24.     </servlet-mapping> 
  25.  
  26. </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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值