2011年5月19日 星期四

【Java Web】commons-fileUpload 使用方法

說到檔案上傳,可以直接採用讀取串流的方式,例如之前的文章 檔案上傳多檔上傳

以上兩篇文章都是用擷取串流的方式,不過做法不同,如果要採用的話盡量以多檔上傳那篇比較好

但是相對的在寫程式時就要顧慮到很多東西,所以可以採用現在比較常用的檔案上下傳的模組

本篇來介紹一下 Apache 的 Commons-fileUpload 說實在的 它比 jspSmartUpload 好用太多了

包含對中文亂碼的處理,相信用過 jspSmartUpload 的人都知道這個困擾

要使用 Commons-fileUpload 的話必須先到 Apache 下的目錄將它下載下來

將 JAR 檔加到你的Java Web 專案中的 WEB_INF 的 lib 裡,就可以了

接下來在次說明一下檔案上傳時的網頁欄位寫法要點,記得就是

要將 form 表單的 enctype 屬性設定成 "multipart/form-data"

接下來就剩下請求路徑的 Servlet 的寫法了,以下以一個範例作呈現

//....
/*** 
    以下透過 ServletFileUpload 的靜態方法判斷目前這個請求是否為"上傳文件", 
    request 為 HttpServletRequest 
***/
if(ServletFileUpload.isMultipartContent(request)){  
    FileItemFactory factory =  new DiskFileItemFactory();  //第一步先建立你的"硬碟工廠"
    factory.setSizeThreshold(50*1024);  //這裡設定緩存的最大容量
    
    ServletFileUpload upload =  new ServletFileUpload(factory);  //以 factory 建構一個Servlet的
上傳處理
 
    List<fileitem> fileItems = upload.parseRequest(request);  //獲取所有 form 表單的欄位
    int allcount = fileItems.size();  //這樣可以取出所有欄位的數量
    
    Iterator<fileitem> iter = fileItems.iterator();
    while(iter.hasNext())
    {
        FileItem item = (FileItem)iter.next();  //取出一個表單欄位,會被視為一個 FileItem 物件
        if(item.isFormField()){  //這裡表示表單欄位為正常形態的欄位,即並非上傳欄位
            //here you can do something....
            String name = item.getFieldName();   //取得欄位名稱
            String value = item.getString();   //取得該欄位對應的值
            //here you can do something....
        }else{  //這裡表示表單欄位為上傳型態的欄位
            String fileName = item.getName();   //取得檔案名稱
            String browser = request.getHeader("user-agent");    //get user's browser
            if(browser.indexOf("MSIE") != -1){   //means user's browser is IE
                fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
            }
            /*以上擷取客戶的瀏覽器目的在於,檔案上傳時 firefox和chrome的鏢頭欄位中的
              filename的值會是你所上傳的檔案名稱, 可是 IE 並不是, IE的值會是以上傳檔案的路徑
              所以以上的動作就是對字串做擷取 */
            //here you can do something...
 
            int fileSize = item.getSize(); //取得檔案大小
            java.io.File fileOnServer =  new java.io.File("儲存位置", fileName);  //建立上傳檔案的物件
            item.write(fileOnServer);  //寫入資料
            item.getContentType()  //取得檔案的 MIME-TYPE
        }
        
    }

}

沒有留言:

張貼留言