星期一, 2月 14, 2011

Servlet 3.0 檔案上傳

作  者:吳修福 精誠資訊 恆逸教育訓練中心 資深講師
技術分類:程式設計
Servlet 3.0(JSR-315)中加入了處理 Multipart 資料的能力。由於 Java EE 6 的規範才在去年(2010)底正式發佈,所以要使用這個功能的話你必須要有支援Java EE 6 或是Servlet 3.0 的Web Container(例如 GlassFish V3)。

建立上傳用的表單

使用這個功能的表單在設定上必須要:
  • form 標籤的 method 必須為「POST」
  • form 標籤中必須有 enctype 的屬性,值必須為「multipart/form-data」
  • 只要少了上述的其中一項,Servlet 在運作的過程中都會有 Exception 發生。
以下是測試用的表單及測試欄位內容:
1. 
2. 檔案: 3. 4.

接收上傳資料用的 Servlet

上傳資料同樣是透過 request 物件來取得,只有兩個方法:getParts 及 getPart。前者可以取得 Part 類型物件的集合,後者可以給一個欄位名稱做為參數來取得特定的 Part 物件:
1. // 取得 Part 集合             
2. Collectionparts= request.getParts();             
3.              
4. // 取得特定的 Part 物件             
5. Partpart = request.getPart("myfile");   
不管是哪個方法,現在關鍵就在那個 Part 類型(javax.servlet.http.Part)的物件了。基本上 Part 是個介面,實作由伺服器提供,其中定義了以下這些方法:
  • String getContentType():取得 Part 物件的 Content-Type 表頭內容。如果是一般的欄位或是沒有上傳資料的話會得到 null。
  • String getHeader(String name):取得指定的表頭內容,如果同名表頭有多個,則只取得第一個內容。
  • Collection getHeaderNames():取得所有表頭名稱。
  • Collection getHeaders(String name):取得指定表頭的所有內容。
  • getName():取得欄位名稱。
  • getSize():取得上傳的資料大小,單位為 byte。
  • getInputStream():取得 InputStream 物件,用來取得上傳的資料內容。
  • write(String fileName):將上傳的內容寫入指定的檔案名稱。
  • delete():刪除上傳的暫時性資料。
接下來使用者就可以透過上述的API來處理上傳的資料內容了。