使用瀏覽器進行檔案上傳時,是使用multipart/form-data編碼,然而Servlet容器並不會自動幫我們處理編碼,而必須由程式設計人員自行處理,在這個部份,我們可以使用Oreilly所提供的上傳套件MultiPartRequest,您可以至以下的網址下載,檔案是cos- 05Nov2002.zip:
解開zip檔案之後,在lib目錄下可以找到cos.jar,將它複製至您的Web應用程式的WEB-INF/lib下就可以了,基本上, Oreilly的MultiPartRequest相當的容易使用,它可以同時處理多個檔案的上傳,並且提供多個方法可以讓您取得上傳檔案的相關資訊。
這邊提供一個簡單的例子,首先撰寫上傳的表單:
- form.htm
<html>
<head>
<title>檔案上傳</title>
<meta http-equiv="Content-Type"
content="text/html; charset=Big5">
</head>
<body>
<b>檔案上傳</b></font></p>
<form name="UploadForm"
enctype="multipart/form-data"
method="post" action="upload.jsp">
<input type="file" name="File1" size="20" maxlength="20">
<br>
<input type="file" name="File2" size="20" maxlength="20">
<br>
<input type="submit"value="上傳">
</form>
</body>
</html>
這邊示範兩個檔案的上傳,表單的enctype必須設定為multipart/form-data,而上傳方法是post,表單元件的輸入型態是 file,當然,上傳的檔案數在實際應用時,是可以用JavaScript等方法來動態進行選擇的。
上傳的動作處理,撰寫在upload.jsp中:
- upload.jsp
<%@page import="com.oreilly.servlet.MultipartRequest" %>
<%
String saveDirectory = "/home/caterpillar/files/";
// 限制上傳之檔案大小為 5 MB
int maxPostSize = 5 * 1024 * 1024 ;
MultipartRequest multi = new MultipartRequest(request ,
saveDirectory , maxPostSize, "MS950");
out.println("檔案上傳OK");
%>
注意到程式中import了com.oreilly.servlet.MultipartRequest, MultipartRequest可以限制檔案上傳的大小,最後一個參數是上傳檔案名稱的編碼,如果不設定的話,預設是ISO-8859-1,為了支援繁體中文檔名,程式中設定為MS950,如果要支援簡體中文檔名,可以設定為GB2312。
基本上您只要建立MultipartRequest物件就完成了檔案上傳的處理動作,如果要額外取得檔案資訊,您可以從 MultipartRequest物件取得,例如getFileNames()、getContentType()、getFile()等等, getFileNames()所取得的是Enumeration型態之物件,可以這麼使用:
while(filenames.hasMoreElements()) {
String filename = (String) filenames.nextElement();
out.println("上傳了檔案" + filename + "<br>");
}
其它有關於MultipartRequest的說明,您可以參考下載的zip檔中之api說明。