Servlet 3.0之前的版本中,文件上傳是個挺讓人頭疼的問題,雖然有第三方框架來實現,但使用也還是比較麻煩,在Servlet 3.0中,這些問題將不復存在,Servlet 3.0對文件上傳提供了直接支持,配合Servlet 3.0中基于Annotations的配置,大大簡化上傳件的操作。
一、javax.servlet.http中Part接口
public interface Part
要上傳文件必須使用multipart/form-data作為request body。
版本:
Servlet 3.1 - Apache Tomcat 8.0.33
二、方法概述
方法 | 描述 |
---|---|
void delete() | 刪除磁盤上關于此part對象的緩存文件 |
java.lang.String getContentType() | 獲取瀏覽器傳遞過來的ContentType |
java.lang.String getHeader(java.lang.String name) | 獲取瀏覽器傳遞過來的特定的header,參數是header的名字 |
java.util.Collection getHeaderNames() | 獲取傳遞給這個part的所有header的名字 |
java.util.Collection getHeaders(java.lang.String name) | 獲取該name對應的所有的value |
java.io.InputStream getInputStream() | 獲取InputStream對象,可以用于獲取上傳的文件的內容 |
java.lang.String getName() | 獲取對應于此part的multipart表單的名字 |
long getSize() | 獲取此part的大小,如果是上傳文件的話,表示上傳的文件大小 |
java.lang.String getSubmittedFileName() | 如果此part表示上傳文件的話,返回上傳的文件的名字 |
void write(java.lang.String fileName) | 一個比較方便的方法,將上傳的文件寫入磁盤中 |
三、@MultipartConfig注解
用于處理文件上傳的servlet必須使用@MultipartConfig注解,@MultipartConfig注解有4個屬性。
屬性 | 類型 | 概述 |
---|---|---|
fileSizeThreshold | int | 文件大小閥值,當文件大小大于此值時,文件將被寫入磁盤 |
location | String | 服務器端目錄,服務器把客戶端上傳的文件默認存入此目錄下 |
maxFileSize | long | 允許上傳的文件的最大大小,默認是-1,表示沒有限制 |
maxRequestSize | long | 限制該multipart/form-data請求的最大數據量,默認是-1,表示沒有限制 |
四、處理文件上傳的servlet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
//此處的@MultipartConfig注解給出了文件存放的地址和允許上傳的文件最大值 @MultipartConfig (location= "F:/" , maxFileSize = 1024 * 1024 * 20 ) public class UploadFileTest extends HttpServlet{ private static final long serialVersionUID = 1L; //使用了commons-logging和log4j來處理日志 private static Log log = LogFactory.getLog(UploadFileTest. class ); //獲取注解中設置的值 private static MultipartConfig config = UploadFileTest. class .getAnnotation(MultipartConfig. class ); public UploadFileTest() { // TODO Auto-generated constructor stub } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding( "UTF-8" ); Part part = null ; try { part = request.getPart( "file" ); //獲取part用于處理上傳的文件 } catch (IllegalStateException ise){ //上傳的單個文件超出maxFileSize或者上傳的總的數據量超出maxRequestSize時會拋出此異常 if (config.maxRequestSize() == -1L) //如果注解中沒設置此項,那就是單個文件超出限制 log.error( "單個文件超限" ); else if (config.maxFileSize() == -1L) //如果注解中沒有設置單個文件最大限制,那就是總數據量超限。 log.error( "總數據量超限" ); else log.error( "Error" ); } if (part == null ) return ; String fileName = part.getSubmittedFileName(); //獲得上傳的文件名,沒有判斷用戶沒有選擇文件直接提交的情況,沒有判斷上傳文件失敗的情況 log.info( "contentType : " + part.getContentType()); log.info( "fileName : " + fileName); log.info( "fileSize : " + part.getSize()); log.info( "header names :" ); for (String headerName : part.getHeaderNames()) log.info(headerName + " : " + part.getHeader(headerName)); //為了避免文件重名,將時間組合到了文件名中。實際項目中可以考慮使用用戶主鍵或者生成一個唯一的ID來組合文件名。 String saveName = System.currentTimeMillis() + fileName; part.write(saveName); //將上傳的文件保存到磁盤,默認是注解中location的相對地址,也可以傳入一個絕對路徑 response.setContentType( "text/html;charset=UTF-8" ); PrintWriter out = response.getWriter(); String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n" ; out.println(docType + "<html>\n" + "<head><title>Upload File</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">Upload File</h1>\n" + "<h2 align=\"center\">上傳文件" + fileName+ "成功," + "可以到項目目錄的F:\\下查看,保存的文件名是:" + saveName+ "</h2>\n" + "</body></html>" ); } } |
五、前端html頁面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<!DOCTYPE html> <html> <head> <meta charset= "UTF-8" > <title>Upload File</title> </head> <body> <form action= "upload" method= "POST" enctype= "multipart/form-data" > <table align= "center" border= "1" width= "50%" > <tr> <td>選擇要上傳的文件:</td> <td><input type= "file" name= "file" ></td> </tr> <tr> <td><input type= "submit" value= "上傳" ></td> </tr> </table> </form> </body> </html> |
servlet使用了注解的方式注冊,所以不再需要使用web.xml文件。新建一個web工程,就使用這兩個文件就可以部署到tomcat了,要訪問的url是http://localhost:8080/UploadFileTest/UploadFile.html
總結
以上所述是小編給大家介紹的servlet3 upload上傳文件實踐,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.csdn.net/u010902721/article/details/51378282