Vincent.Chan‘s Blog

常用链接

统计

积分与排名

网站

最新评论

Commons FileUpload

UUID是Universally Unique IDentifier,他是一組128bit的數字,定義在http://www.ietf.org/internet-drafts/draft- mealling-uuid-urn-03.txt .相信有寫過Windows程式的人對他不會太陌生.

 有時後我們在分散式的系統下,希望要產生唯一的一個ID.如果我們不希望用centralize的方式產生的話,我們可以用UUID來產生Unique ID,這個演算法讓我們幾乎不會產生重複的ID.使用方法也很簡單:

UUID uuid = UUID.randomUUID();        
System.out.printf("UUID : %s", uuid).println();
使用瀏覽器進行檔案上傳時,是使用multipart/form-data編碼,然而
Servlet容器並不會自動幫我們處理編碼,而必須由程式設計人員自行處理,Jakarta Commons
FileUpload可以讓您輕易的處理檔案上傳事務,您可以在這個網頁中找到下載檔案,撰寫本文時最新的版本是1.0,檔名是commons-
fileupload-1.0.zip:

http://jakarta.apache.org/site/binindex.cgi

 將zip檔案解開,將commons-fileupload-1.0.jar放置在WEB-INF/lib下,這邊先提供一個快速入門的例子,首先撰寫上傳的表單:

upload.html
<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>

 要處理上傳的檔案,首先要設定一些儲存檔案所需的資訊,然後處理上傳請求:

DiskFileUpload fu = new DiskFileUpload();
// 使用的記憶體容量,超過先寫入暫存檔
fu.setSizeThreshold(4096);
// 最大上傳檔案容量
fu.setSizeMax(1000000);
// 暫存目錄
fu.setRepositoryPath(application.getRealPath("/"));
List fileItems = fu.parseRequest(request);

 上面的程式也可以綜合為下面這行程式:

DiskFileUpload upload = new DiskFileUpload();
List items = upload.parseRequest(request,
yourMaxMemorySize, yourMaxRequestSize, yourTempDirectory);

parserRequest()傳回的List內含FileItem物件,我們可以取出並寫入檔案,例如:

Iterator itr = fileItems.iterator();
while(itr.hasNext()) {
FileItem fi = (FileItem)itr.next();

out.println("\nNAME: "+fi.getName());
out.println("SIZE: "+fi.getSize());
File fNew= new File(application.getRealPath("/"), fi.getName());
fi.write(fNew);
}

 上面的程式將會將檔案寫入Web應用程式的根目錄,下面的JSP程式是個簡單的檔案上傳範例:

upload.jsp
<%@ page import="org.apache.commons.fileupload.DiskFileUpload"%>
<%@ page import="org.apache.commons.fileupload.FileItem"%>
<%@ page import="java.util.List"%>
<%@ page import="java.util.Iterator"%>
<%@ page import="java.io.File"%>
<%@page contentType="text/html;charset=Big5"%>
<%
DiskFileUpload fu = new DiskFileUpload();
// 使用的記憶體容量,超過先寫入暫存檔
fu.setSizeThreshold(4096);
// 最大上傳檔案容量
fu.setSizeMax(1000000);
// 儲存的目錄
fu.setRepositoryPath(application.getRealPath("/") + "temp/");
List fileItems = fu.parseRequest(request);

Iterator itr = fileItems.iterator();
while(itr.hasNext()) {
FileItem fi = (FileItem)itr.next();

out.println("\nNAME: "+fi.getName());
out.println("SIZE: "+fi.getSize());
File fNew= new File(application.getRealPath("/"), fi.getName());
fi.write(fNew);
}
%>

 這邊是以寫入檔案為例,如果有要進行額外的處理,例如取得串流或位元陣列,則可以使用FileItem的getInputStream()或get()來分別取得,詳細的方法可以查詢API文件。

有時候您會在表單中包括有檔案描述與檔案上傳欄位,例如:

<form name="UploadForm" enctype="multipart/form-data" method="post" action="upload.jsp">
上傳檔案 1 <input type="file" name="File1" size="20" maxlength="20"> <br>
檔案描述 1 <input type="text" name="File1" size="30" maxlength="50"> <br>
上傳檔案 2<input type="file" name="File2" size="20" maxlength="20"> <br>
檔案描述 2 <input type="text" name="File1" size="30" maxlength="50"> <br>
<input type="submit"value="上傳">
</form>

這時候在上傳處理時,必須要分別是檔案欄位還是一般的表單欄位,您可以使用FileItem的isFormField()來進行判斷,例如:

Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();

if (item.isFormField()) {
// 處理檔案描述欄位
processFormField(item);
} else {
// 處理上傳的檔案
processUploadedFile(item);
}
}

另外上檔檔案瀏覽器傳送檔案名稱時,有的瀏覽器可能會包括檔案路徑資訊,為了處理這種情況,我們可以事先處理一下這個可能性,例如在processUploadedFile()方法中這麼實作:

String fileName = item.getName();
try {
// unix-like 系統
fileName = FileName.substring(FileName.lastIndexOf("/")+1);
// Windows 系統
// fileName = FileName.substring(FileName.lastIndexOf("\\")+1);

} catch (Exception e) {
.....
}
附帶一提,Struts 1.1中的org.apache.struts.upload套件,就使用了Commons FileUpload,您可以參考這個連接有關於Struts中如何進行檔案上傳:
http://www.caterpillar.onlyfun.net/phpBB2/viewtopic.php?t=1315

posted on 2006-03-23 00:11 Vincent.Chen 阅读(542) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航: