Java web開發中文件上傳是比較經常使用的功能,例如論壇註冊的時候上傳幾K的圖片做爲頭像。前段時間信手翻了翻架子上的書,看到servlet3.0新特性當中有對文件上傳功能的支持,隨便寫寫servlet 3.0當中的Part和common-fileupload的ServletFileUpload。 html
html的<input type = "file" ...>標籤表示文件域,能夠在頁面上產生一個文本框和一個文件選擇按鈕,要實現文件上傳功能,該標籤須要配置enctype屬性,一般的配置是:<form method = "post" action = "#" enctype = "multipart/form-data"></form>
java
再來講說Part,每個Part對象對應着一個文件上傳域,Part對象提供了許多訪問上傳文件屬性的方法,並提供write(String file)方法用於把上傳的文件寫入服務器硬盤。 web
能夠在web.xml中經過<multipart-config>對上傳參數進行配置,servlet配置: 服務器
<servlet> <servlet-name>uploadFile</servlet-name> <servlet-class>test.testFileUpload.com.UploadFileAction</servlet-class> <multipart-config> <max-file-size>1024000</max-file-size> </multipart-config> </servlet>
Part對象經過request對象獲取文件上傳域,經過write(String path)方法把文件寫入到指定路徑。上傳action部分代碼:
post
public void doServices(HttpServletRequest request, HttpServletResponse response) throws IOException{ Part part = null ; try { part = request.getPart("uploadFile"); } catch (IllegalStateException | ServletException e) { e.printStackTrace(); } String fileName = request.getParameter("fileName"); String path = getServletContext().getRealPath("/uploadFiles")+"/"+fileName; part.write(path); }
而後再說說ServletFileUpload,common-fileupload須要和common-io配套使用,一般通須要經過DiskFileItemFactory設置上傳文件臨時存儲路徑、文件存儲路徑、上傳文件大小限制等,經過ServletFileUpload對象的parseRequest方法獲取FileItem對象列表,而後遍歷列表獲取form上傳域。文件上傳Action代碼以下:
spa
public void doServices(HttpServletRequest request, HttpServletResponse response){ DiskFileItemFactory factory = new DiskFileItemFactory(); String tmpPath = getServletContext().getRealPath("/uploadFilesTmp")+"/";//臨時路徑 String path = getServletContext().getRealPath("/uploadFiles")+"/";//文件存儲路徑 factory.setRepository(new File(tmpPath)); factory.setSizeThreshold(1024*1024); //緩衝區大小 ServletFileUpload servletFileUpload = new ServletFileUpload(factory); servletFileUpload.setFileSizeMax(-1);//設置上傳文件大小 try { List<FileItem> fileItemList = servletFileUpload.parseRequest(request); for(FileItem fileItem : fileItemList){ if((!fileItem.isFormField())&&(fileItem.getSize()>0)){ String clientPath = fileItem.getName(); clientPath.replaceAll("\\\\", "/"); String clientFileName = clientPath.substring(clientPath.lastIndexOf("/")+1); System.out.println(clientFileName); File storeInServerFile = new File(path+"temp"); fileItem.write(storeInServerFile); }else{} } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }