1. 程式人生 > >Spring MVC 實現圖片上傳功能

Spring MVC 實現圖片上傳功能

Spring MVC 實現圖片上傳
  使用者必須能夠上傳圖片,因此需要檔案上傳的功能。比較常見的檔案上傳元件有Commons FileUpload(http://jakarta.apache.org/commons/fileupload/a>)和COS FileUpload(http://www.servlets.com/cos),Spring已經完全集成了這兩種元件,這裡我們選擇Commons FileUpload。
  由於Post一個包含檔案上傳的Form會以multipart/form-data請求傳送給伺服器,必須明確告訴DispatcherServlet如何處理MultipartRequest。首先在dispatcher-servlet.xml中宣告一個MultipartResolver:

xml 程式碼
  1. <beanid="multipartResolver"
  2. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <!-- 設定上傳檔案的最大尺寸為1MB -->
  4. <propertyname="maxUploadSize">
  5. <value>1048576</value>
  6. </property>
  7. </bean>

 這樣一旦某個Request是一個MultipartRequest,它就會首先被MultipartResolver處理,然後再轉發相應的Controller。
在UploadImageController中,將HttpServletRequest轉型為MultipartHttpServletRequest,就能非常方便地得到檔名和檔案內容:

java 程式碼
  1. public ModelAndView handleRequest(HttpServletRequest request,   
  2.             HttpServletResponse response) throws Exception {   
  3. // 轉型為MultipartHttpRequest:
  4.         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
  5. // 獲得檔案:
  6.         MultipartFile file = multipartRequest.getFile(
    " file ");   
  7. // 獲得檔名:
  8.         String filename = file.getOriginalFilename();   
  9. // 獲得輸入流:
  10.         InputStream input = file.getInputStream();   
  11. // 寫入檔案
  12. // 或者:
  13.         File source = new File(localfileName.toString());   
  14.         multipartFile.transferTo(source);   
  15.     }  

生成縮圖 (目錄)
  當用戶上傳了圖片後,必須生成縮圖以便使用者能快速瀏覽。我們不需藉助第三方軟體,JDK標準庫就包含了影象處理的API。我們把一張圖片按比例縮放到120X120大小,以下是關鍵程式碼:

java 程式碼
  1. publicstaticvoid createPreviewImage(String srcFile, String destFile) {   
  2. try {   
  3.             File fi = new File(srcFile); // src
  4.             File fo = new File(destFile); // dest
  5.             BufferedImage bis = ImageIO.read(fi);   
  6. int w = bis.getWidth();   
  7. int h = bis.getHeight();   
  8. double scale = (double) w / h;   
  9. int nw = IMAGE_SIZE; // final int IMAGE_SIZE = 120;
  10. int nh = (nw * h) / w;   
  11. if (nh > IMAGE_SIZE) {   
  12.                 nh = IMAGE_SIZE;   
  13.                 nw = (nh * w) / h;   
  14.             }   
  15. double sx = (double) nw / w;   
  16. double sy = (double) nh / h;   
  17.             transform.setToScale(sx, sy);   
  18.             AffineTransformOp ato = new AffineTransformOp(transform, null);   
  19.             BufferedImage bid = new BufferedImage(nw, nh,   
  20.                     BufferedImage.TYPE_3BYTE_BGR);   
  21.             ato.filter(bis, bid);   
  22.             ImageIO.write(bid, " jpeg ", fo);   
  23.         } catch (Exception e) {   
  24.             e.printStackTrace();   
  25. thrownew RuntimeException(   
  26. " Failed in create preview image. Error:  "
  27.                             + e.getMessage());   
  28.         }   
  29.     }