分享

利用 Oreilly MultiPartRequest 解決 上傳檔案 的問題

 Joshua 2006-01-07

利用 Oreilly MultiPartRequest 解決 上傳檔案 的問題

一般的輸入型態 (例如:text、password、radio、checkbox、select …等等 ),它傳送表單到伺服器端時,所使用的編碼方式是application/x-www-form-urlencoded,但是當要傳送檔案至伺服器端時,必須使用到multipart/form-data的編碼方式。正因為雙方在傳送資料時所使用到的編碼方式不一樣,因此在接收使用者傳來的資料時,不能直接使用request.getParameter( )來取得。假若讀者有興趣想更了解檔案上傳的規格時,可以至下列這個網址, http://ds./rfc/rfc1867.txt,將可以查詢到更加詳細的規格說明。

在來介紹一套目前最常使用,也是筆者目前在使用的元件。那就是由歐萊禮 (O‘Reilly)公司所提供的MultipartRequest類別工具,它除了可供免費下載之外,還會不定期新增功能,並且它還有公開原始碼供使用者參考,若有興趣的讀者可至:http://www./resources/com.oreilly.servlet/ 免費下載。


這個範例會有二個檔案,名稱皆為File,不過一個是HTML檔,另一個是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當中,我們允許使用者一次上傳三個檔案,並且可以針對每個上傳檔案做一小段的敘述。

圖 一 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 ; 

    // 宣告敘述上傳檔案內容的變數,型態為String	
    String FileDescription[] = {null,null,null}; 

    // 宣告上傳檔案名稱 String FileName = null;	
    // 計算上傳檔案之個數 int count = 0 ;
%>

<html>
<head>
<title>File Upload</title>
</head>

<%	
    // 產一個新的MultipartRequest 的物件,multi 
    MultipartRequest multi = new MultipartRequest(request , saveDirectory , maxPostSize ); 
%>
<body>
<% 
	// 判斷是否有取得檔案敘述, 
	// 若有,將資料給FileDescription	
  	// 若無,將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] = ""; 
	} 
	
	// 取得所有上傳之檔案輸入型態名稱 
	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 %>個的檔案:</font><br>
檔案名稱為:<%= FileName %><br>
檔案型態為:<%=   ContentType %><br>
檔案的敘述:<%= FileDescription[count-1] %><br><br>

<%	
		 } // end if 
	} // end while
%> 
您總共上傳<font color="red"><%= count %></font>個檔案
</body>
</html>

一開始我們先取得所有檔案輸入型態的名稱,即<input type="file" name="xxxx" >中的xxxx,因此根據File.htm的內容,filesname的內容分別由File1、File2和File3組成。再來使用filesname.nextElement(),將它們一一取出來,存入到name的變數當中,而name的內容就是File1或File2或File3,最後再利用name,取得真正上傳檔案之檔案、檔案名稱、檔案型態。圖(二)是File.jsp的執行結果。

圖二 File.jsp的執行結果

 

 

 

 

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多