今天要用到一個圖片上傳的,據說Struts2就是用的這個,啃了啃鷹文文檔,實驗了下common-fileupload實驗成功了,記錄下:前端
Servlet裏doPost()方法貼出:java
/** 大體步驟爲: * 1.準備FileItem工廠; * 2.把工廠交給ServletFileUpload,讓他把前端的表單條條信息解析; * 3.處理解析好返回的列表中的每個具體項 */ @SuppressWarnings("unchecked") @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* FileItemFactory是FileItem的工廠,不過它只是個interface, * 有兩個實現DiskFileItemFactory和DefaultFileItemFactory; * 可是api裏說:"Deprecated. Use DiskFileItemFactory instead." */ FileItemFactory itemFactory = new DiskFileItemFactory(); /* FileUpload類是用來處理文件的上傳,而ServletFileUpload是它的子類, * 能夠判斷和解析前端的表單類型和表單項信息 */ ServletFileUpload upload = new ServletFileUpload(itemFactory); List<FileItem> list = null; try { //parseRequest將前端的表單項項解析爲FileItem列表 list = upload.parseRequest(request); Iterator<FileItem> it = list.iterator(); while (it.hasNext()) { /* * 最核心的就是FileItem了,若是form的屬性是enctype=multipart/form-data, * 那麼它會用來描述POST請求的form表單的每個普通表單項和上傳項; * 能夠認爲每個input對應的就是一個FileItem;看看FileItem的屬性封裝就知道了(加入客戶端有): * 用戶<input type="text" name="userName"><br>//普通表單項 * 圖片1<input type="file" name="img1"/><br/>//上傳項 * 1.getContentType() //普通表單項null;上傳項要看類型如jpg,jpeg是image/jpeg;png是image/png;gif是image/gif: * 2.getFieldName() //就是前臺的name="userName"和name="img1"; * 3.getString() //就是用戶填寫的用戶名,如你在表單裏輸入"root"提交後getString()就獲得root; * 3.getInputStream() //根據輸出判斷:普通項是ByteArrayInputStream類型,上傳項目是:FileInputStream類型 * 4.getName() //普通表單項null,上傳項爲出去目錄名後的文件名,如:"ubuntuBackground.jpg" * 5.getOutputStream() //輸出流,沒有深看 * 6.getSize() //大小:普通爲用戶輸入字符的字節數,上傳爲文件的大小字節數; * 7.isFormField() //這個就是判斷是普通項[true],仍是上傳項[false]; */ FileItem item = it.next(); /* 過濾下,只有表單項中類型爲圖片的才保存 */ if ("image/jpeg".equals(item.getContentType()) || "image/gif".equals(item.getContentType()) || "image/png".equals(item.getContentType())) { InputStream inStream = item.getInputStream(); byte[] b = new byte[1024]; int rb = inStream.read(b); File file=new File("/home/nie/images/", item.getName()); OutputStream outStream = new FileOutputStream(file); while (rb != -1) { outStream.write(b); rb = inStream.read(b); } outStream.flush(); inStream.close(); outStream.close(); } } } catch (FileUploadException e) { e.printStackTrace(); } }
總結來看,重要的就3個東西:ubuntu
而後就能夠用IO了;api
---[2011-07-29]---ide