XWAF提供了上傳文件的HttpFileUploader工具類,具備強大的多文件上傳、文件類型過濾、文件大小限制、存儲目錄設置、文件名稱更改等功能,簡化了Web應用開發的編程工作。 它能同時解析表單參數和文件域,不僅能夠將文件保存到伺服器上,還能同時提取表單參數的值。 ...
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綁定的數據欄位將保存原值不變!