1. 程式人生 > >使用XWAF框架(2)——上傳檔案

使用XWAF框架(2)——上傳檔案

       XWAF提供了上傳檔案HttpFileUploader工具類具備強大的多檔案上傳、檔案型別過濾、檔案大小限制、儲存目錄設定、檔名稱更改等功能,簡化了Web應用開發的程式設計工作

能同時解析表單引數和檔案域,不僅能夠將檔案儲存到伺服器上,還能同時提取表單引數的值。

  如果要在儲存上傳檔案之前提取引數值,就需要先呼叫“parseRequest()”方法,並使用該方法返回的物件替換request變數,然後再使用getParameter(name) 方法提取引數值。

參考程式碼如下:

private ServletConfig config = null;

public void init(ServletConfig config) throws ServletException {

         this.config = config;

 }

       protected void doPost(HttpServletRequest request,  HttpServletResponse response)

                         throws ServletException, IOException {

    ......

    HttpFileUploader hfu = new HttpFileUploader(config, request);        

    request = hfu.parseRequest();

    request.getParameter(“name”); 

    ......

    hfu.saveFilesAndParameters(true);

      }

 

2.1  上傳檔案型別過濾

  呼叫上傳檔案處理器的setFileFilter()方法,參考程式碼如下

hfu.setFileFilter(“*.jpg|*.png|*.gif”);

2.2  限制上傳檔案的大小

  呼叫上傳檔案處理器的setOneFileSize()方法限制單個檔案的大小(單位:M),呼叫setTotalFileSize()方法限制多個檔案的總大小。參考程式碼如下

hfu.setOneFileSize(4);     // 單個檔案不能大於4兆。

hfu.setTotalFileSize(50);  // 總檔案大小不能大於50兆。

2.3  設定檔案儲存目錄

  呼叫上傳檔案處理器的setStoredFilesFold(“總目錄名稱”)方法設定儲存上傳檔案的總目錄,處理器會自動在總目錄下面建立三個子目錄:Musics、Photos、Videos分別用於存放音訊檔案、圖片檔案和視訊檔案。

  如果程式設計師沒有設定總目錄,處理器會在網站根目錄建立如下預設的目錄結構:Uploads、Uploads/Musics、Uploads/Photos、Uploads/Videos等,用於存放上傳檔案。

參考程式碼: 

hfu.setStoredFilesFold(“MyUploads”);

2.4  設定上傳檔案的名稱

  上傳檔案處理器預設是採用原檔名,根據檔案的型別分別存放到對應的子目錄。但是,程式設計師可以使用setFileNameSetType()方法,選擇多種方式給檔案命名,這些方式以如下列舉值來表示:

hfu.setFileNameSetType(FileNameSetType.UseOldName);

    說明:使用原檔名稱

hfu.setFileNameSetType(FileNameSetType.UseTimes);  

    說明:使用時間戳命名

hfu.setFileNameSetType(FileNameSetType.UsePrefix);  

    說明:在原檔名稱前使用字首字元

hfu.setFileNameSetType(FileNameSetType.UsePrefixTimes);

    說明:使用字首和時間戳命名上傳檔案

hfu.setFileNameSetType(FileNameSetType.UseOldNameTimes);

    說明:在原檔名稱後新增時間戳

hfu.setFileNameSetType(FileNameSetType.UsePrefixOldNameTimes);

    說明:在原檔名稱前面加字首,在後面加時間戳

hfu.setFileNameSetType(FileNameSetType.UseCustom);

    說明:使用自定義的檔名!

如果選擇了與字首相關的命名方式,就必須設定字首屬性值才有效。參考程式碼如下:

hfu.setFileNamePrefix("upf_"); // 設定預設字首!

hfu.setImageFilePrefix("img_"); // 圖片檔案字首,若不設定就使用預設字首!

hfu.setVideoFilePrefix("vid_"); // 視訊檔案字首,若不設定就使用預設字首!

hfu.setMusicFilePrefix("msc_"); // 音訊檔案字首,若不設定就使用預設字首!

如果設定為使用者自定義檔名稱,就要同時在頁面檔案中提供使用者編輯檔名稱的文字域標記,並在HttpHandler檔案中提取對應的文字域引數值,再呼叫上傳檔案處理器的setCustomFileName()方法,參考程式碼如下:

String strPVal = request.getParameter("MyPhotoCustom");

hfu.setCustomFileName("MyPhoto", strPVal);

如果程式設計師沒有呼叫setCustomFileName()方法設定自定義檔名,處理器將自動使用原檔名稱。

2.5  獲取上傳檔案在伺服器的路徑和名稱

  呼叫儲存上傳檔案的方法之後,程式設計師可以使用如下語句:

         Map<String, String> savedFilePaths = hfu.getUploadFilePaths();

  獲取全部上傳檔案的伺服器儲存路徑和檔名稱集合(Map),該Map的key值是檔案域的name屬性值,value值是儲存到伺服器上的相對路徑和檔名。程式設計師還可以呼叫方法:

         String  strFilePath = hfu.getUploadFilePath(“MyPhoto”);

  獲取指定檔案域的上傳檔案在伺服器的儲存路徑和名稱。

2.6  設定統一的上傳檔案限制條件

  使用者可以在使用XWAG生成程式碼之後,設定或修改XwafConfig.xml配置檔案中與檔案上傳相關的各個引數項,節點如下所示:

<!-- 設定檔案上傳的限制條件 -->

  <uploadFile>

    <storedFold>/Uploads</storedFold>

    <oneFileSize>4</oneFileSize>

    <totalFileSize>100</totalFileSize>

    <coverOldFile>true</coverOldFile>

    <fileFilter>*.*</fileFilter>

  </uploadFile>

2.7  檔案上傳與資料庫更新

  在實際專案開發中,開發人員往往使用資料欄位記錄一個資原始檔的路徑,檔案本身獨立存放在一個子目錄中。如果編輯包含這種資原始檔路徑的資料記錄,可能就需要使用file”檔案域上傳新檔案,並同時將上傳到伺服器的檔案路徑和名稱儲存到資料欄位中。XWAF框架可以幫助伺服器程式碼實現這樣的功能。

  由於使用者對編輯頁面中“file”檔案域的操作,可能沒有選擇任何要上傳檔案,伺服器該如何處理呢?

     XWAF框架約定如下:

     1)如果使用者當前操作是新增記錄,則與file標記繫結的資料欄位將被賦予null值;

     2)如果是更新記錄,則伺服器將忽略該file引數,伺服器端程式碼也無法訪問沒有上傳檔案的file元素,與file繫結的資料欄位將儲存原值不變!