[原創]java WEB學習筆記49:文件上傳基礎,基於表單的文件上傳,使用fileuoload 組件

本博客爲原創:綜合 尚硅谷(http://www.atguigu.com)的系統教程(深表感謝)和 網絡上的現有資源(博客,文檔,圖書等),資源的出處我會標明

本博客的目的:①總結本身的學習過程,至關於學習筆記 ②將本身的經驗分享給你們,相互學習,互相交流,不可商用

內容不免出現問題,歡迎指正,交流,探討,能夠留言,也能夠經過如下方式聯繫。

本人互聯網技術愛好者,互聯網技術發燒友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------html

1.基於表單的文件上傳java

  1)若是在表單中使用表單元素 <input type=「file」 />,瀏覽器在解析表單時,會自動生成一個輸入框和一個按鈕,輸入框可供用戶填寫本地文件的文件名和路徑名,按鈕可讓瀏覽器打開一個文件選擇框供用戶選擇文件:apache

        

 

  2)Enctype 屬性瀏覽器

  ① 當表單須要上傳文件時,需指定表單 enctype 的值爲 multipart/form-data服務器

  ② 在 form 元素的語法中,enctype 屬性指定將數據發送到服務器時瀏覽器使用的編碼類型網絡

  ③ enctype 屬性取值:app

    > application/x-www-form-urlencoded:表單 enctype 屬性的默認值。這種編碼方案使用有限的字符集,當使用了非字母和數字時,必須用」%HH」代替(H 表明十六進制數字)。對於大容量的二進制數據或包含非 ASCII 字符的文原本說,這種編碼不能知足要求jsp

    > multipart/form-data:form 設定了enctype=「multipart/form-data」屬性後,表示表單以二進制傳輸數據 post

 

  3)總結:進行文件上傳時,表單須要作的準備學習

   ① 請求請求方式爲 post  :<form action="uploadServlet" method="post"   ....... >

   ② 使用file 表單域  File:<input type="file" name="file"/>

   ③ 使用請求編碼方式 : enctype="multipart/form-data"

   ④ 在服務端不能再使用 request.getParameter() 等方式獲取請求信息。獲取不到,由於請求的編碼方式已經爲multipart/form-data ,以二進制的方式來提交請求信息,可使用輸入流的方式來獲取請求信息

 

upload.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2  pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     
11     <form action="uploadServlet" method="post" enctype="multipart/form-data">
12         File:<input type="file" name="file"/>
13         <br><br>
14         Desc:<input type="text" name="desc"/>
15         <br><br>
16         <input type="submit" value="submit"/>
17     </form>
18 
19 </body>
20 </html>

 

 

 

UploadServlet.java

 

 1 package com.jason.fileupload;  2 
 3 import java.io.BufferedReader;  4 import java.io.IOException;  5 import java.io.InputStream;  6 import java.io.InputStreamReader;  7 import java.io.Reader;  8 
 9 import javax.servlet.ServletException; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 
15 /**
16  * Servlet implementation class UploadServlet 17  */
18 @WebServlet("/uploadServlet") 19 public class UploadServlet extends HttpServlet { 20     private static final long serialVersionUID = 1L; 21 
22     /**
23  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 24      */
25     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 26         //1.獲取請求信息 27 // String file = request.getParameter("file"); 28 // String desc = request.getParameter("desc"); 29 //        
30 // System.out.println(file); 31 // System.out.println(desc); 32         
33         //以流的方式處理 上傳的代碼
34         InputStream in = request.getInputStream(); 35         
36         Reader reader = new InputStreamReader(in); 37         BufferedReader bufferedReader = new BufferedReader(reader); 38         
39         String str = null; 40         
41         while((str = bufferedReader.readLine()) != null){ 42  System.out.println(str); 43  } 44 
45  } 46 
47     
48     
49     
50 }

 

 

2.使用fileuoload 組件

  1)環境的搭建:加入jar包到 lib目錄

  

  2)基本思想:

  ① commons-fileupload 能夠解析請求,獲得一個FileItem 對象組成的List

    ② commons-fileupload 把請求的信息都解析爲FileItem 對象,不管是一個通常的文本域仍是一個文件域

  ③ 能夠調用 FileItem 的 isFormField() 方法來判斷是一個表單域 或不是表單域(則是一個文件域)

  ④ 進一步獲取信息

    

1 // Process a regular form field
2 if (item.isFormField()) { 3     String name = item.getFieldName(); 4     String value = item.getString(); 5  ... 6 }

 

 

1 // Process a file upload
2 if (!item.isFormField()) { 3     String fieldName = item.getFieldName(); 4     String fileName = item.getName(); 5     String contentType = item.getContentType(); 6     boolean isInMemory = item.isInMemory(); 7     long sizeInBytes = item.getSize(); 8  ... 9 }

 

 

   3) 如何獲得List<FileItem> 對象

簡單方式:

1 // Create a factory for disk-based file items
2 FileItemFactory factory = new DiskFileItemFactory(); 3 
4 // Create a new file upload handler
5 ServletFileUpload upload = new ServletFileUpload(factory); 6 
7 // Parse the request
8 List /* FileItem */ items = upload.parseRequest(request);

 

 

複雜方式:能夠對文件的上牀加入限制條件和其餘屬性

 1 // Create a factory for disk-based file items
 2 DiskFileItemFactory factory = new DiskFileItemFactory();  3 
 4 // Set factory constraints
 5 factory.setSizeThreshold(yourMaxMemorySize);//設置內存中最多能夠存放的上傳的文件的大小,若超出則把文件寫到一個臨時文件夾中,以 byte 爲單位  6 factory.setRepository(yourTempDirectory);//設置那個臨時文件夾  7 
 8 // Create a new file upload handler
 9 ServletFileUpload upload = new ServletFileUpload(factory); 10 
11 // Set overall request size constraint
12 upload.setSizeMax(yourMaxRequestSize);//設置整個文件的大小 13 
14 // Parse the request
15 List /* FileItem */ items = upload.parseRequest(request);

 

 

 

 helloword.java測試

 

 1 package com.jason.fileupload;  2 
 3 import java.io.BufferedReader;  4 import java.io.File;  5 import java.io.FileOutputStream;  6 import java.io.IOException;  7 import java.io.InputStream;  8 import java.io.InputStreamReader;  9 import java.io.OutputStream; 10 import java.io.Reader; 11 import java.util.List; 12 
13 import javax.servlet.ServletException; 14 import javax.servlet.annotation.WebServlet; 15 import javax.servlet.http.HttpServlet; 16 import javax.servlet.http.HttpServletRequest; 17 import javax.servlet.http.HttpServletResponse; 18 
19 import org.apache.commons.fileupload.FileItem; 20 import org.apache.commons.fileupload.FileUploadException; 21 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 22 import org.apache.commons.fileupload.servlet.ServletFileUpload; 23 
24 /**
25  * Servlet implementation class UploadServlet 26  */
27 @WebServlet("/upload/uploadServlet") 28 public class UploadServlet extends HttpServlet { 29     private static final long serialVersionUID = 1L; 30 
31     /**
32  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 33  * response) 34      */
35     protected void doPost(HttpServletRequest request, 36             HttpServletResponse response) throws ServletException, IOException { 37         // 1.獲得FileIrem 的集合 items 38         // Create a factory for disk-based file items
39         DiskFileItemFactory factory = new DiskFileItemFactory(); 40 
41         // Set factory constraints
42         factory.setSizeThreshold(1024 * 500); 43         File tempDirectory = new File("e:\\tempDirectory"); 44  factory.setRepository(tempDirectory); 45 
46         // Create a new file upload handler
47         ServletFileUpload upload = new ServletFileUpload(factory); 48 
49         // Set overall request size constraint
50         upload.setSizeMax(1024 * 1024 * 5); 51 
52         // Parse the request
53         try { 54             List<FileItem> items = upload.parseRequest(request); 55             // 2.遍歷items:如果通常表單域,打印信息
56             for (FileItem item : items) { 57                 if (item.isFormField()) { 58                     String name = item.getFieldName(); 59                     String value = item.getString(); 60                     System.out.println(name + " : " + value); 61                 } else { 62                     // 3.如果文件域則把文件保存到目錄 files
63                     String fieldName = item.getFieldName(); 64                     String fileName = item.getName(); 65                     String contentType = item.getContentType(); 66                     long sizeInBytes = item.getSize(); 67 
68  System.out.println(fieldName); 69  System.out.println(fileName); 70  System.out.println(contentType); 71  System.out.println(sizeInBytes); 72 
73                     InputStream in = item.getInputStream(); 74                     byte[] buffer = new byte[1024]; 75                     int len = 0; 76                     fileName = "e:\\file\\" + fileName; 77  System.out.println(fileName); 78 
79                     OutputStream out = new FileOutputStream(fileName); 80                     while ((len = in.read(buffer)) != -1) { 81                         out.write(buffer, 0, len); 82  } 83  out.close(); 84  in.close(); 85  } 86  } 87 
88         } catch (FileUploadException e) { 89  e.printStackTrace(); 90  } 91 
92  } 93 
94 }

 

 

 upload.jsp

 

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2  pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     
11     <form action="uploadServlet" method="post" enctype="multipart/form-data">
12         File:<input type="file" name="file"/>
13         <br><br>
14         Desc:<input type="text" name="desc"/>
15         <br><br>
16         <input type="submit" value="submit"/>
17     </form>
18 
19 </body>
20 </html>
相關文章
相關標籤/搜索