以上兩篇文章都是用擷取串流的方式,不過做法不同,如果要採用的話盡量以多檔上傳那篇比較好
但是相對的在寫程式時就要顧慮到很多東西,所以可以採用現在比較常用的檔案上下傳的模組
本篇來介紹一下 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 } } }
沒有留言:
張貼留言