星期五, 1月 26, 2007

Jakarta Commons FileUpload


上傳檔案在 Web Application 開發中是很常遇到的需求,Jakarta 的 commons FileUpload package 提供了一個很不錯的檔案上傳功能,可以讓我們簡單的就完成檔案上傳的功能。


commons fileUpload 網站上有大概說明怎麼使用這個 package 做上傳,大致上的 code 如下:



// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Parse the request
List /* FileItem */ items = upload.parseRequest(request);

Iterator itr = items.iterator();

while(itr.hasNext()){
FileItem item = (FileItem)itr.next();

if(item.isFormField()){
processFormField(item);
} else {
processUploadedFile(item);
}
}



因為現在我們使用的是上傳檔案的 form ( enctype="multipart/form-data" ),所以我們要抓從頁面傳過來的值不能直接使用 request.getParameter("parameter_name") 的方式,而是得要使用類似底下的方式:



// Process a regular form field
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
...
}



至於處理上傳檔案的部分則是類似底下的 code:



// Process a file upload
if (!item.isFormField()) {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
...
}

// Process a file upload
if (writeToFile) {
File uploadedFile = new File(...);
item.write(uploadedFile);
} else {
InputStream uploadedStream = item.getInputStream();
...
uploadedStream.close();
}



上面大部分的 code 都是從 commons fileUpload 網站上 copy 下來的,但是這些都是在當你上傳的檔案檔名是英文以及輸入的欄位資料也是英文的情況下才會正常 work。若你輸入的是中文,你就會發現亂碼問題又出現了。

其實這問題跟我上一篇寫的 UTF-8 有很大的相關。先說明要如何解決這問題:
1. 設定 ServletFileUpload 的 header encoding


upload.setHeaderEncoding("UTF-8");


2. 抓取參數 value 的時候加入 UTF-8


String value = item.getString("UTF-8");



除了這個,還有一些要注意到的地方,底下是我的 upload.jsp 內容:



有空再繼續寫後續的東西好了,這篇主要還是先回歸到介紹 upload package 以及如何解決中文檔名以及中文輸入的問題。

沒有留言: