利用 Oreilly MultiPartRequest 解決 上傳檔案 的問(wèn)題
一般的輸入型態(tài) (例如:text、password、radio、checkbox、select …等等 ),它傳送表單到伺服器端時(shí),所使用的編碼方式是application/x-www-form-urlencoded,但是當要傳送檔案至伺服器端時(shí),必須使用到multipart/form-data的編碼方式。正因為雙方在傳送資料時(shí)所使用到的編碼方式不一樣,因此在接收使用者傳來(lái)的資料時(shí),不能直接使用request.getParameter( )來(lái)取得。假若讀者有興趣想更了解檔案上傳的規格時(shí),可以至下列這個(gè)網(wǎng)址, http://ds.internic.net/rfc/rfc1867.txt,將可以查詢(xún)到更加詳細的規格說(shuō)明。
在來(lái)介紹一套目前最常使用,也是筆者目前在使用的元件。那就是由歐萊禮 (O‘Reilly)公司所提供的MultipartRequest類(lèi)別工具,它除了可供免費下載之外,還會(huì )不定期新增功能,並且它還有公開(kāi)原始碼供使用者參考,若有興趣的讀者可至:http://www.servlets.com/resources/com.oreilly.servlet/ 免費下載。
這個(gè)範例會(huì )有二個(gè)檔案,名稱(chēng)皆為File,不過(guò)一個(gè)是HTML檔,另一個(gè)是JSP檔。
File.htm
<html><head><title>File Upload</title><meta http-equiv="Content-Type" content="text/html; charset=big5"></head><body bgcolor="#FFFFFF" text="#000000"><p><font size="5"color="#FF0000"><b>第七章 檔案上傳範例</b></font></p><form name="Form1" enctype="multipart/form-data" method="post" action="File.jsp"> <p>上傳檔案 1: <input type="file"name="File1" size="20" maxlength="20"> </p><p>檔案1敘述: <input type="text" name="File1" size="30" maxlength="50"> </p><p>上傳檔案 2: <input type="file" name="File2" size="20" maxlength="20"> </p><p>檔案2敘述: <input type="text" name="File2" size="30" maxlength="50"> </p><p>上傳檔案3: <input type="file" name="File3" size="20" maxlength="20"> </p><p>檔案3敘述: <input type="text" name="File3" size="30" maxlength="50"> </p><p> <input type="submit"value="上傳"> <input type="reset" value="清除"> </p></form></body></html>
執行結果如圖 (一)所示,讀者可看出,在File.htm當中,我們允許使用者一次上傳三個(gè)檔案,並且可以針對每個(gè)上傳檔案做一小段的敘述。

圖 一 File.htm的執行結果
File.jsp
<%@ page language="java" %><%@ page import="java.io.*" %><%@ page import="java.util.*" %><%@ page import="com.oreilly.servlet.MultipartRequest" %><%! // 宣告將上傳之檔案放置到伺服器的C:\Upload目錄中 // 宣告限制上傳之檔案大小為 5 MB String saveDirectory = "C:\\Upload\\"; int maxPostSize = 5 * 1024 * 1024 ; // 宣告敘述上傳檔案內容的變數,型態(tài)為String String FileDescription[] = {null,null,null}; // 宣告上傳檔案名稱(chēng) String FileName = null; // 計算上傳檔案之個(gè)數 int count = 0 ;%><html><head><title>File Upload</title></head><% // 產(chǎn)一個(gè)新的MultipartRequest 的物件,multi MultipartRequest multi = new MultipartRequest(request , saveDirectory , maxPostSize ); %><body><% // 判斷是否有取得檔案敘述, // 若有,將資料給FileDescription // 若無(wú),將FileDescription的內容設為空白字串 if ( multi.getParameter("File1") != null ) { FileDescription[0] = multi.getParameter("File1"); } else { FileDescription[0] = ""; } if ( multi.getParameter("File2") != null ) { FileDescription[1] = multi.getParameter("File2"); } else { FileDescription[1] = ""; } if ( multi.getParameter("File3") != null ) { FileDescription[2] = multi.getParameter("File3"); } else { FileDescription[2] = ""; } // 取得所有上傳之檔案輸入型態(tài)名稱(chēng) Enumeration filesname = multi.getFileNames(); while (filesname.hasMoreElements()) { String name = (String) filesname.nextElement(); FileName = multi.getFilesystemName(name); File f = multi.getFile(name); String ContentType = multi.getContentType(name); if (FileName != null) { count ++;%><font color="red">你上傳的第<%= count %>個(gè)的檔案:</font><br>檔案名稱(chēng)為:<%= FileName %><br>檔案型態(tài)為:<%= ContentType %><br>檔案的敘述:<%= FileDescription[count-1] %><br><br><% } // end if } // end while%> 您總共上傳<font color="red"><%= count %></font>個(gè)檔案</body></html>一開(kāi)始我們先取得所有檔案輸入型態(tài)的名稱(chēng),即<input type="file" name="xxxx" >中的xxxx,因此根據File.htm的內容,filesname的內容分別由File1、File2和File3組成。再來(lái)使用filesname.nextElement(),將它們一一取出來(lái),存入到name的變數當中,而name的內容就是File1或File2或File3,最後再利用name,取得真正上傳檔案之檔案、檔案名稱(chēng)、檔案型態(tài)。圖(二)是File.jsp的執行結果。

圖二 File.jsp的執行結果
聯(lián)系客服