springMvc上傳文件、讀取zip/rar文件


參考文章:

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();
    }
}
View Code

 

------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM