使用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繫結的資料欄位將儲存原值不變!