參考文章:
http://www.cnblogs.com/interdrp/p/6734033.html
方法一:
1)沒有配置org.springframework.web.multipart.commons.CommonsMultipartResolver
2)MultipartFile轉化為File的方式為:
MultipartFile file = multiRequest.getFile("imgFile");
CommonsMultipartFile cf= (CommonsMultipartFile) file;
DiskFileItem fi = (DiskFileItem ) cf.getFileItem();
File fs = fi.getStoreLocation();
代碼例子1:保存用戶信息,用戶有照片
//增加用戶 @RequestMapping("/addUser") @ResponseBody public String addUser(HttpServletRequest request, HttpServletResponse response){ String username = ""; int age = 0; String photoName = ""; byte[] photo = null; //創建一個通用的多部分解析器. CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //判斷 request 是否有文件上傳,即多部分請求... if(multipartResolver.isMultipart(request)){ //轉換成多部分request MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request); //獲取普通表單的屬性 username = multiRequest.getParameter("username"); String ageStr = multiRequest.getParameter("age"); if(ageStr!=null){ try{ age = Integer.parseInt(ageStr); }catch(Exception e){ e.printStackTrace(); } } //取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); while(iter.hasNext()){ //取得上傳文件 MultipartFile file = multiRequest.getFile(iter.next()); if(file != null){ //取得當前上傳文件的文件名稱 photoName = file.getOriginalFilename(); try { InputStream inputStream = file.getInputStream(); photo = new byte[inputStream.available()]; inputStream.read(photo); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } User user = new User(username, age, photoName, photo); int count = userService.insertUser(user); if(count > 0){ return "success"; }else{ return "failed"; } }
代碼例子2:上傳壓縮包zip或者rar;這里是單包上傳(single),每個zip/rar下面直接是一個一個的jpg圖片;
//上傳圖片zip/rar文件 -- @RequestMapping("/uploadImageFile") @ResponseBody public String uploadImageFile(HttpServletRequest request, HttpServletResponse response){ CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); if(multipartResolver.isMultipart(request)){ MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request); String packageType = multiRequest.getParameter("packageType"); if(packageType.equals("single")){ //單包 MultipartFile file = multiRequest.getFile("imgFile"); if(file != null){ String packageName = file.getOriginalFilename(); //上傳的包名 String iconName = productService.getIconNameByPackage(packageName); //獲取該包下面的縮略圖名稱 if(packageName.matches(".*\\.zip")){ //是zip壓縮文件 try{ ZipInputStream zs = new ZipInputStream(file.getInputStream()); BufferedInputStream bs = new BufferedInputStream(zs); ZipEntry ze; byte[] picture = null; while((ze = zs.getNextEntry()) != null){ //獲取zip包中的每一個zip file entry String fileName = ze.getName(); //pictureName picture = new byte[(int) ze.getSize()]; //讀一個文件大小 bs.read(picture, 0, (int) ze.getSize()); ImageFile image = new ImageFile(packageName, "N", fileName, picture); //保存image,非縮略圖 productService.insertImage(image); if(fileName.equals(iconName)){ //這個picture要作為縮略圖,進行裁剪、保存 String thumbName = ImageUtil.createThumbFileName(fileName); //生成縮略圖名稱 InputStream is = new ByteArrayInputStream(picture); byte[] thumbPic = ImageUtil.clipImage(is, 100, 100, "jpg"); //進行裁剪 ImageFile thumbImage = new ImageFile(packageName, "Y", thumbName, thumbPic); productService.insertImage(thumbImage); } } bs.close(); zs.close(); return "success"; }catch(IOException e){ e.printStackTrace(); } }else if(packageName.matches(".*\\.rar")){ //是rar壓縮文件 try { //MultipartFile file 轉化為File 有臨時文件產生: CommonsMultipartFile cf= (CommonsMultipartFile) file; DiskFileItem fi = (DiskFileItem ) cf.getFileItem(); File fs = fi.getStoreLocation(); Archive archive = new Archive(fs); ByteArrayOutputStream bos = null; byte[] picture = null; FileHeader fh = archive.nextFileHeader(); while(fh!=null){ String fileName = fh.getFileNameString(); bos = new ByteArrayOutputStream(); archive.extractFile(fh, bos); picture = bos.toByteArray(); ImageFile image = new ImageFile(packageName, "N", fileName, picture); //保存image,非縮略圖 productService.insertImage(image); fh = archive.nextFileHeader(); } bos.close(); archive.close(); return "success"; } catch (RarException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } } return "failed"; }
方法二:配置org.springframework.web.multipart.commons.CommonsMultipartResolver
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8"></property> <property name="maxUploadSize" value="10485760000"></property> <property name="maxInMemorySize" value="40960"></property> </bean>
代碼例子:
//上傳文件zip/rar 方法二 配置org.springframework.web.multipart.commons.CommonsMultipartResolver @RequestMapping("/uploadImageFile2") @ResponseBody public String uploadImageFile2(HttpServletRequest request, HttpServletResponse response){ MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; String packageType = multiRequest.getParameter("packageType"); if(packageType.equals("single")){ //單包 MultipartFile file = multiRequest.getFile("imgFile"); if(file != null){ String packageName = file.getOriginalFilename(); //上傳的包名 String iconName = productService.getIconNameByPackage(packageName); //獲取該包下面的縮略圖名稱 if(packageName.matches(".*\\.zip")){ //是zip壓縮文件 try{ ZipInputStream zs = new ZipInputStream(file.getInputStream()); BufferedInputStream bs = new BufferedInputStream(zs); ZipEntry ze; byte[] picture = null; while((ze = zs.getNextEntry()) != null){ //獲取zip包中的每一個zip file entry String fileName = ze.getName(); //pictureName picture = new byte[(int) ze.getSize()]; //讀一個文件大小 bs.read(picture, 0, (int) ze.getSize()); ImageFile image = new ImageFile(packageName, "N", fileName, picture); //保存image,非縮略圖 productService.insertImage(image); if(fileName.equals(iconName)){ //這個picture要作為縮略圖,進行裁剪、保存 String thumbName = ImageUtil.createThumbFileName(fileName); //生成縮略圖名稱 InputStream is = new ByteArrayInputStream(picture); byte[] thumbPic = ImageUtil.clipImage(is, 100, 100, "jpg"); //進行裁剪 ImageFile thumbImage = new ImageFile(packageName, "Y", thumbName, thumbPic); productService.insertImage(thumbImage); } } bs.close(); zs.close(); return "success"; }catch(IOException e){ e.printStackTrace(); } }else if(packageName.matches(".*\\.rar")){ //是rar壓縮文件 //....和上面一樣。 } } } return "failed"; }
最后補充上面用到的工具類:ImageUtil.java(里面有對圖片裁剪的方法)
package com.cy.util; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; public class ImageUtil { /** * 判斷壓縮文件的類型 */ /** * 生成縮略圖名稱 * @param srcFileName * @return */ public static String createThumbFileName(String srcFileName){ StringBuffer thumbFileName = new StringBuffer(); int pos = srcFileName.lastIndexOf("."); thumbFileName.append(srcFileName.substring(0, pos)); thumbFileName.append("_small"); thumbFileName.append(srcFileName.substring(pos, srcFileName.length())); return thumbFileName.toString(); } /** * 對圖片進行剪裁 * @param is 圖片輸入流 * @param width 裁剪圖片的寬 * @param height 裁剪圖片的高 * @param imageFormat 輸出圖片的格式 * @return */ public static byte[] clipImage(InputStream is,int width, int height, String imageFormat){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { // 構造Image對象 BufferedImage src = javax.imageio.ImageIO.read(is); // 縮小邊長 BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 繪制 縮小 后的圖片 tag.getGraphics().drawImage(src, 0, 0, width, height, null); ImageIO.write(tag, imageFormat, bos); } catch (IOException e) { e.printStackTrace(); }finally{ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return bos.toByteArray(); } }
------------
