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 閱讀(558) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 金湖县| 乌兰浩特市| 雅江县| 五原县| 新竹市| 梁山县| 沧州市| 兴文县| 安吉县| 茂名市| 田林县| 乐都县| 桦南县| 万源市| 台山市| 梁平县| 呈贡县| 始兴县| 蒙城县| 容城县| 梅河口市| 繁昌县| 房产| 尼玛县| 莱州市| 南涧| 蓬安县| 思茅市| 桐庐县| 民勤县| 双城市| 南乐县| 精河县| 德化县| 阿图什市| 黄山市| 雅安市| 黔西县| 西贡区| 黄大仙区| 静乐县|