Servlet實現文件上傳

1、Servlet實現文件上傳,須要添加第三方提供的jar包:html

二:java

文件上傳的表單提交方式必須是POST方式,apache

編碼類型:enctype="multipart/form-data",默認是 application/x-www-form-urlencoded數組

好比:<form action="FileUpLoad"   enctype="multipart/form-data"   method="post">緩存


3、舉例app

1.fileupload.jspjsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  post

  2. <%  ui

  3. String path = request.getContextPath();  編碼

  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  

  5. %>  

  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

  7. <html>  

  8.   <head>  

  9.     <base href="<%=basePath%>">  

  10.     <title>My JSP 'fileupload.jsp' starting page</title>       

  11.     <meta http-equiv="pragma" content="no-cache">  

  12.     <meta http-equiv="cache-control" content="no-cache">  

  13.     <meta http-equiv="expires" content="0">      

  14.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

  15.     <meta http-equiv="description" content="This is my page">  

  16.   </head>  

  17.   <body>  

  18.      <!-- enctype 默認是 application/x-www-form-urlencoded -->  

  19.      <form action="FileUpLoad" enctype="multipart/form-data" method="post" >  

  20.                用戶名:<input type="text" name="usename"> <br/>  

  21.                上傳文件:<input type="file" name="file1"><br/>  

  22.               上傳文件: <input type="file" name="file2"><br/>  

  23.               <input type="submit" value="提交"/>  

  24.      </form>        

  25.   </body>  

  26. </html>  


2.實際處理文件上傳的 FileUpLoad.java

[java] view plaincopy

  1. package com.servlet.fileupload;  

  2. import java.io.File;  

  3. import java.io.*;  

  4. import java.io.IOException;  

  5. import java.io.PrintWriter;  

  6. import java.util.List;  

  7. import javax.servlet.ServletException;  

  8. import javax.servlet.http.HttpServlet;  

  9. import javax.servlet.http.HttpServletRequest;  

  10. import javax.servlet.http.HttpServletResponse;  

  11. import org.apache.commons.fileupload.FileItem;  

  12. import org.apache.commons.fileupload.FileUploadException;  

  13. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  

  14. import org.apache.commons.fileupload.servlet.ServletFileUpload;  

  15. /** 

  16.  *  

  17.  * @author Administrator 

  18.  * 文件上傳 

  19.  * 具體步驟: 

  20.  * 1)得到磁盤文件條目工廠 DiskFileItemFactory 要導包 

  21.  * 2) 利用 request 獲取 真實路徑 ,供臨時文件存儲,和 最終文件存儲 ,這兩個存儲位置可不一樣,也可相同 

  22.  * 3)對 DiskFileItemFactory 對象設置一些 屬性 

  23.  * 4)高水平的API文件上傳處理  ServletFileUpload upload = new ServletFileUpload(factory); 

  24.  * 目的是調用 parseRequest(request)方法  得到 FileItem 集合list , 

  25.  * 5)在 FileItem 對象中 獲取信息,   遍歷, 判斷 表單提交過來的信息 是不是 普通文本信息  另作處理 

  26.  * 6) 

  27.  *    第一種. 用第三方 提供的  item.write( new File(path,filename) );  直接寫到磁盤上 

  28.  *    第二種. 手動處理   

  29.  */  

  30. public class FileUpLoad extends HttpServlet {  

  31.     public void doPost(HttpServletRequest request, HttpServletResponse response)  

  32.             throws ServletException, IOException {  

  33.         request.setCharacterEncoding("utf-8");  //設置編碼  

  34.         //得到磁盤文件條目工廠  

  35.         DiskFileItemFactory factory = new DiskFileItemFactory();  

  36.         //獲取文件須要上傳到的路徑  

  37.         String path = request.getRealPath("/upload");  

  38.         //若是沒如下兩行設置的話,上傳大的 文件 會佔用 不少內存,  

  39.         //設置暫時存放的 存儲室 , 這個存儲室,能夠和 最終存儲文件 的目錄不一樣  

  40.         /** 

  41.          * 原理 它是先存到 暫時存儲室,而後在真正寫到 對應目錄的硬盤上,  

  42.          * 按理來講 當上傳一個文件時,實際上是上傳了兩份,第一個是以 .tem 格式的  

  43.          * 而後再將其真正寫到 對應目錄的硬盤上 

  44.          */  

  45.         factory.setRepository(new File(path));  

  46.         //設置 緩存的大小,當上傳文件的容量超過該緩存時,直接放到 暫時存儲室  

  47.         factory.setSizeThreshold(1024*1024) ;         

  48.         //高水平的API文件上傳處理  

  49.         ServletFileUpload upload = new ServletFileUpload(factory);  

  50.         try {  

  51.             //能夠上傳多個文件  

  52.             List<FileItem> list = (List<FileItem>)upload.parseRequest(request);  

  53.             for(FileItem item : list)  

  54.             {  

  55.                 //獲取表單的屬性名字  

  56.                 String name = item.getFieldName();  //例如:name="usename"

  57.                 //若是獲取的表單信息是普通的文本信息  

  58.                 if(item.isFormField())  

  59.                 {                     

  60.                     //獲取用戶具體輸入的字符串 由於表單提交過來的是 字符串類型的  

  61.                     String value = item.getString() ;     

  62.                     request.setAttribute(name, value);  

  63.                 }  

  64.                 //對傳入的非 簡單的字符串進行處理 ,好比說二進制的圖片,電影這些  

  65.                 else  

  66.                 {  

  67.                     /** 

  68.                      * 如下三步,主要獲取上傳文件的名字 

  69.                      */  

  70.                     //獲取路徑名  

  71.                     String value = item.getName() ;  

  72.                     //索引到最後一個反斜槓  

  73.                     int start = value.lastIndexOf("\\");  

  74.                     //截取上傳文件的字符串名字,加1是 去掉反斜槓,  

  75.                     String filename = value.substring(start+1);  

  76.                     request.setAttribute(name, filename);  

  77.                     //真正寫到磁盤上  

  78.                     //它拋出的異常 用exception 捕捉  

  79.                     //item.write( new File(path,filename) );//第三方提供的  

  80.                     //手動寫的  

  81.                     OutputStream out = new FileOutputStream(new File(path,filename));  

  82.                     InputStream in = item.getInputStream() ;  

  83.                     int length = 0 ;  

  84.                     byte [] buf = new byte[1024] ;  

  85.                     System.out.println("獲取上傳文件的總共的容量:"+item.getSize());  

  86.                     // in.read(buf) 每次讀到的數據存放在  buf 數組中  

  87.                     while( (length = in.read(buf) ) != -1)  

  88.                     {  

  89.                         //在   buf 數組中取出數據寫到(輸出流)磁盤上  

  90.                         out.write(buf, 0, length);

  91.                     }         

  92.                     in.close();  

  93.                     out.flush();

  94.                     out.close();  

  95.                 }  

  96.             }        

  97.         } catch (FileUploadException e) {  

  98.             // TODO Auto-generated catch block  

  99.             e.printStackTrace();  

  100.         }  

  101.         catch (Exception e) {  

  102.            // TODO Auto-generated catch block  

  103.            e.printStackTrace();  

  104.         }              

  105.         request.getRequestDispatcher("filedemo.jsp").forward(request, response);  

  106.     }    

  107. }  

3.filedemo.jsp

[html] view plaincopy

  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 'filedemo.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.   </head>  

    <body>        

  1.     用戶名:${requestScope.usename } <br/>  

  2.     文件:${requestScope.file1 }<br/>  

  3.     ${requestScope.file2 }<br/>  

  4.     <!-- 把上傳的圖片顯示出來 -->  

  5.     <img alt="go" src="upload/<%=(String)request.getAttribute("file1")%> " />       

  6.   </body>  

  7. </html>  


4結果頁面

相關文章
相關標籤/搜索