jsp servlet 上傳文件

當我們在 HTML 表單中選擇本地文件之後點擊“提交”按鈕則會將文件上傳到服務器中,此時該 HTTP 請求正文的數據類型就是 multipart/form-data 型的。而在 Servlet 技術中,該 HTTP 請求會被 Servlet 容器(如 Tomcat)包裝成 HttpServletRequest 對象,再由端所請求的相應 Servlet 進行處理。

但是,如果此時我們在服務器端編寫的 Servlet 一點點地解析這個 HTTP 請求,分離出其中的文本表單和上傳的文件類型,這未免有點低效。於是,我們可以使用 Apache 開源上傳軟件包 fileupload 來簡化這一過程,直接使用即可。下載地址:http://commons.apache.org/fileupload/

在 fileupload 包中, HTTP 請求中的複雜表單元素都被看做一個 FileItem 對象;FileItem 對象必須由 ServletFileUpload 類中的 parseRequest() 方法解析 HTTP 請求(即被包裝之後的 HttpServletRequest 對象)出來,即分離出具體的文本表單和上傳文件;而 ServletFileUpload 對象的創建需要依賴於 FileItemFactory 工廠將獲得的上傳文件 FileItem 對象保存至服務器硬盤,即 DiskFileItem 對象。

呼…把這個 fileupload 包中的關係講得那麼亂,最好還是自己看下載下來的幫助文檔。不過,推薦一個免費的 Java 反編譯器 JD-GUI ,用它能夠很輕鬆地打開 .jar 文件,除了源代碼中的註釋,其他的一覽無遺,很好用啊。下載地址:http://java.decompiler.free.fr/?q=jdgui

好吧,我們的程序要求:

1、提供一個 HTML 文件,用戶可在相應表單中選擇需要上傳的文件;

2、編寫一個名叫 UploadServlet 的Servlet 文件,主要功能是解析上面 HTML 表單所提交的 HTTP 請求,把普通的文本域和文件域分離開來;

3、UploadServlet 根據 web.xml 配置文件中的初始化參數確定好需要在 Web 服務器存放該文件的目錄,將上傳的文件寫入到該存放目錄中,在我的這裏我把上傳的文件保存到 F:\java\JavaWeb\ch05\uploadFile 目錄中,而 F:\java\JavaWeb\ch05\temp 目錄則用作該 Web 應用的臨時目錄。

程序代碼:

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.*;  
  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.  
  9. // Servlet 文件上傳  
  10. public class UploadServlet extends HttpServlet  
  11. {  
  12.     private String filePath;    // 文件存放目錄  
  13.     private String tempPath;    // 臨時文件目錄  
  14.  
  15.     // 初始化  
  16.     public void init(ServletConfig config) throws ServletException  
  17.     {  
  18.         super.init(config);  
  19.         // 從配置文件中獲得初始化參數  
  20.         filePath = config.getInitParameter("filepath");  
  21.         tempPath = config.getInitParameter("temppath");  
  22.  
  23.         ServletContext context = getServletContext();  
  24.  
  25.         filePath = context.getRealPath(filePath);  
  26.         tempPath = context.getRealPath(tempPath);  
  27.         System.out.println("文件存放目錄、臨時文件目錄準備完畢 ...");  
  28.     }  
  29.       
  30.     // doPost  
  31.     public void doPost(HttpServletRequest req, HttpServletResponse res)  
  32.         throws IOException, ServletException  
  33.     {  
  34.         res.setContentType("text/plain;charset=gbk");  
  35.         PrintWriter pw = res.getWriter();  
  36.         try{  
  37.             DiskFileItemFactory diskFactory = new DiskFileItemFactory();  
  38.             // threshold 極限、臨界值,即硬盤緩存 1M  
  39.             diskFactory.setSizeThreshold(4 * 1024);  
  40.             // repository 貯藏室,即臨時文件目錄  
  41.             diskFactory.setRepository(new File(tempPath));  
  42.           
  43.             ServletFileUpload upload = new ServletFileUpload(diskFactory);  
  44.             // 設置允許上傳的最大文件大小 4M  
  45.             upload.setSizeMax(4 * 1024 * 1024);  
  46.             // 解析HTTP請求消息頭  
  47.             List fileItems = upload.parseRequest(req);  
  48.             Iterator iter = fileItems.iterator();  
  49.             while(iter.hasNext())  
  50.             {  
  51.                 FileItem item = (FileItem)iter.next();  
  52.                 if(item.isFormField())  
  53.                 {  
  54.                     System.out.println("處理表單內容 ...");  
  55.                     processFormField(item, pw);  
  56.                 }else{  
  57.                     System.out.println("處理上傳的文件 ...");  
  58.                     processUploadFile(item, pw);  
  59.                 }  
  60.             }// end while()  
  61.  
  62.             pw.close();  
  63.         }catch(Exception e){  
  64.             System.out.println("使用 fileupload 包時發生異常 ...");  
  65.             e.printStackTrace();  
  66.         }// end try ... catch ...  
  67.     }// end doPost()  
  68.  
  69.  
  70.     // 處理表單內容  
  71.     private void processFormField(FileItem item, PrintWriter pw)  
  72.         throws Exception  
  73.     {  
  74.         String name = item.getFieldName();  
  75.         String value = item.getString();          
  76.         pw.println(name + " : " + value + "\r\n");  
  77.     }  
  78.       
  79.     // 處理上傳的文件  
  80.     private void processUploadFile(FileItem item, PrintWriter pw)  
  81.         throws Exception  
  82.     {  
  83.         // 此時的文件名包含了完整的路徑,得注意加工一下  
  84.         String filename = item.getName();         
  85.         System.out.println("完整的文件名:" + filename);  
  86.         int index = filename.lastIndexOf("\\");  
  87.         filename = filename.substring(index + 1, filename.length());  
  88.  
  89.         long fileSize = item.getSize();  
  90.  
  91.         if("".equals(filename) && fileSize == 0)  
  92.         {             
  93.             System.out.println("文件名爲空 ...");  
  94.             return;  
  95.         }  
  96.  
  97.         File uploadFile = new File(filePath + "/" + filename);  
  98.         item.write(uploadFile);  
  99.         pw.println(filename + " 文件保存完畢 ...");  
  100.         pw.println("文件大小爲 :" + fileSize + "\r\n");  
  101.     }  
  102.       
  103.     // doGet  
  104.     public void doGet(HttpServletRequest req, HttpServletResponse res)  
  105.         throws IOException, ServletException  
  106.     {  
  107.         doPost(req, res);  
  108.     }  

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> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章