為了讓首次接觸Fileupload的開(kāi)發(fā)人員能夠更直觀(guān)的理解該項目,我們將實(shí)現一個(gè)簡(jiǎn)單的文件上傳功能,并一步步介紹開(kāi)發(fā)步驟,以及詳細的代碼。
環(huán)境準備
1. 下載并安裝Tomcat(已經(jīng)有很多關(guān)于Tomcat安裝以及使用的文章,在這里不再介紹);
2. 下載File upload的jar包c(diǎn)ommons-fileupload-1.0-beta-1.jar,并將該文件拷貝到{$TOMCAT}/common/lib目錄下(其中{$TOMCAT}為T(mén)omcat的安裝目錄);
3. 由于Fileupload子項目同時(shí)要用到另外一個(gè)項目commons-Beanutils,所以必須下載Beanutils,并將解壓后的文件commons-beanutils.jar拷貝到{$TOMCAT}/common/lib目錄下。
開(kāi)發(fā)文件上傳頁(yè)面
文件上傳的界面如圖1所示。為了增加效率我們設計了三個(gè)文件域,同時(shí)上傳三個(gè)文件。
頁(yè)面的HTML代碼如下:
| <html> <head> <title>文件上傳演示</title> </head> <body bgcolor=“#FFFFFF”text=“#000000” leftmargin=“0”topmargin=“40”marginwidth=“0” marginheight=“0”> <center> <h1>文件上傳演示</h1> <form name=“uploadform”method=“POST” action=“save.jsp”ENCTYPE=“multipart/form-data”> <table border=“1”width=“450”cellpadding=“4” cellspacing=“2”bordercolor=“#9BD7FF”> <tr><td width=“100%”colspan=“2”> 文件1:<input name=“file1”size=“40”type=“file”> </td></tr> <tr><td width=“100%”colspan=“2”> 文件2:<input name=“file2”size=“40”type=“file”> </td></tr> <tr><td width=“100%”colspan=“2”> 文件3:<input name=“file3”size=“40”type=“file”> </td></tr> </table> <br/><br/> <table> <tr><td align=“center”><input name=“upload” type=“submit”value=“開(kāi)始上傳”/></td></tr> </table> </form> </center> </body> </html> |
代碼中要特別注意的是黑體處。必須保證表單的ENCTYPE屬性值為multipart/form-data,這樣瀏覽器才能正確執行上傳文件的操作。
處理上傳文件信息
由于本文主要是講述如何使用Commons-fileupload,所以為了便于修改、調試,上傳文件的保存使用一個(gè)JSP文件來(lái)進(jìn)行處理。我們將瀏覽器上傳來(lái)的所有文件保存在一個(gè)指定目錄下并在頁(yè)面上顯示所有上傳文件的詳細信息。保存頁(yè)面處理結果見(jiàn)圖2所示。
下面來(lái)看看save.jsp的代碼:
| <% /** * 演示文件上傳的處理 * @author <a href=“mailto:winter.lau@163.com”>Winter Lau</a> * @version $Id: save.jsp,v 1.00 2003/03/01 10:10:15 */ %> <%@ page language=“java”contentType=“text/html;charset=GBK”%> <%@ page import=“java.util.*”%> <%@ page import=“org.apache.commons.fileupload.*”%> <html> <head> <title>保存上傳文件</title> </head> <% String msg = “”; FileUpload fu = new FileUpload(); // 設置允許用戶(hù)上傳文件大小,單位:字節 fu.setSizeMax(10000000); // maximum size that will be stored in memory? // 設置最多只允許在內存中存儲的數據,單位:字節 fu.setSizeThreshold(4096); // 設置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數據存放在硬盤(pán)的目錄 fu.setRepositoryPath(“C:\\TEMP”); //開(kāi)始讀取上傳信息 List fileItems = fu.parseRequest(request); %> <body bgcolor=“#FFFFFF”text=“#000000” leftmargin=“0”topmargin=“40”marginwidth=“0” marginheight=“0”> <font size=“6”color=“blue”>文件列表:</font> <center> <table cellpadding=0 cellspacing=1 border=1 width=“100%”> <tr> <td bgcolor=“#008080”>文件名</td> <td bgcolor=“#008080”>大小</td> </tr> <% // 依次處理每個(gè)上傳的文件 Iterator iter = fileItems.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); //忽略其他不是文件域的所有表單信息 if (!item.isFormField()) { String name = item.getName(); long size = item.getSize(); if((name==null||name.equals(“”)) && size==0) continue; %> <tr> <td><%=item.getName()%></td> <td><%=item.getSize()%></td> </tr> <% //保存上傳的文件到指定的目錄 name = name.replace(‘:’,‘_’); name = name.replace(‘\\’,‘_’); item.write(“F:\\”+ name); } } %> </table> <br/><br/> <a href=“upload.html”>返回上傳頁(yè)面</a> </center> </body> </html> |
| FileUpload fu = new FileUpload(); // 設置允許用戶(hù)上傳文件大小,單位:字節 fu.setSizeMax(10000000); // maximum size that will be stored in memory? // 設置最多只允許在內存中存儲的數據,單位:字節 fu.setSizeThreshold(4096); // 設置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數據存放在硬盤(pán)的目錄 fu.setRepositoryPath(“C:\\TEMP”); |
SizeMax 用來(lái)設置上傳文件大小的最大值,一旦用戶(hù)上傳的文件大小超過(guò)該值時(shí)將會(huì )拋出一個(gè)FileUploadException異常,提示文件太大;
SizeThreshold 設置內存中緩沖區的大小,一旦文件的大小超過(guò)該值的時(shí)候,程序會(huì )自動(dòng)將其它數據存放在repositoryPath指定的目錄下作為緩沖。合理設置該參數的值可以保證服務(wù)器穩定高效的運行;
RepositoryPath 指定緩沖區目錄。
使用注意事項
從實(shí)際應用的結果來(lái)看該模塊能夠穩定高效的工作。其中參數SizeThreshold的值至關(guān)重要,設置太大會(huì )占用過(guò)多的內存,設置太小會(huì )頻繁使用硬盤(pán)作為緩沖以致?tīng)奚阅?。因此,設置該值時(shí)要根據用戶(hù)上傳文件大小分布情況來(lái)設定。例如大部分文件大小集中在100KB左右,則可以使用100KB作為該參數的值,當然了再大就不合適了。使用commons-fileupload來(lái)處理HTTP文件上傳的功能模塊很小,但是值得研究的東西很多。
聯(lián)系客服