spring mvc文件上傳(單個文件上傳|多個文件上傳)




單個文件上傳

spring mvc 實現文件上傳需要引入兩個必須的jar包

    1.所需jar包:
        
        commons-fileupload-1.3.1.jar

        commons-io-2.2.jar

    2.定義上傳頁面:

        定義具有上傳功能的xx.jsp,其表單的設置需要注意,method屬性為post,enctype屬性為multipart/form-data

        <!-- 文件上傳 -->
        <form action="<%=basePath%>user/upload" method="post" enctype="multipart/form-data">

            <input type="file" name="photo"/>

            <input type="submit" value="上傳"/>

        </form>

    3.定義處理器:

        對於處理器的定義需要注意以下幾點:

            1.用於接收表單元素所提交參數的處理器方法的形參類型不是file,而是MultipartFile。
              
              MultipartFile為一個接口,專門用於處理文件上傳問題。該接口中具有很多有用的方法。

              例如:

                1.1.獲取參數名稱    getName()

                1.2.獲取文件的原始名稱    getOrinalFilename()

                1.3.獲取文件大小    getSize()

                1.4.判斷文件是否為空    isEmpty()

                1.5.文件上傳        transferTo()

            2.未選擇上傳文件

                    若用戶沒有選擇文件就直接提交了表單,此時處理器方法中的MultipartFile形參接收到的值並非null,

                而是一個emptry的文件,對於未選擇文件這種情況,其判斷條件是file.isEmpty(),並非file==null

            3.上傳文件類型

                    spring mvc的文件上傳功能並沒有直接的用於限制文件上傳類型的屬性或方法,需要對獲取到的文件的后綴名加以判斷,
                
                最好的方式就是使用endsWith(".jpg")

            4.上傳方法

                對於單個文件上傳,直接使用MultipartFile的transferTo(file)方法,就可以完成上傳功能。

                但是,該方法需要服務端用於存放文件的目錄必須存在,否則會出問題


    代碼:
        @RequestMapping("/upload")
        public ModelAndView doUpload(MultipartFile photo,HttpSession session) throws IllegalStateException, IOException{
        
            //判斷這個文件不為空
            if(!photo.isEmpty()){
            
                //服務端的imges目錄需要手動創建好
                String path = session.getServletContext().getRealPath("/Images");
            
                //獲取原始文件名
                String fileName = photo.getOriginalFilename();
            
                //限制上傳類型
            
                if(fileName.endsWith(".jpg")||fileName.endsWith(".png")){
                
                    File file = new File(path, fileName);

                    //完成文件上傳
                    photo.transferTo(file);
                
                }else{
                
                    return new ModelAndView("/user/fail");
                }
            }
        
            return new ModelAndView("/user/success");
        
        }


    3.在spring mvc中注冊文件上傳處理器

        在配置文件中注冊的時候需要注意:

            1.bean的名稱固定:id必須為multipartResolver

            2.文件上傳的字符集:默認為ISO-8859-1,可以通過defaultEncoding屬性設置字符集

            3.限制文件大小:maxUploadSize屬性可以用來限制文件大小,單位B,-1則表示無限制

        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

                <property name="maxUploadSize">

                        <value>100000</value>

                </property>

            <!--設置字符集--!>
                   <property name="defaultEncoding">

                        <value>UTF-8</value>

                </property>

            </bean>



多個文件上傳

    前面的步驟都是一樣的,唯一的區別就是處理器,下面我就給大家詳解多個文件與單個文件上傳的區別,以及需要注意的地方。

    @RequestMapping("/fileUpload")
    public ModelAndView fileUpload(@RequestParam MultipartFile[] photos,HttpSession session) throws IllegalStateException, IOException{
        
        //服務端的imges目錄需要手動創建好
        String path = session.getServletContext().getRealPath("/Images");
        
        for (int i = 0; i < photos.length; i++) {
            if(!photos[i].isEmpty()){
                
                String fileName = photos[i].getOriginalFilename();
            
                if(fileName.endsWith(".jpg")||fileName.endsWith(".png")){
                    
                    File file = new File(path, fileName);

                    //完成文件上傳
                    photos[i].transferTo(file);
                    
                }else{
                    
                    //失敗返回
                    return new ModelAndView("/user/fail");
                }
            
            }
        }
        
        return new ModelAndView("/user/success");
    }

    
    需要注意的地方:

        1.處理器的形參

            用於接收表單元素所提交參數的處理器方法的形參類型為MultipartFile[]數組,並且必須使用注解@RequestParam修飾

            為什么單個文件上傳時不需要@RequestParam注解修飾,而上傳多個文件時就需要用@RequestParam修飾呢?

                因為在上傳多個文件時,每個表單中的文件對象均會被spring mvc框架將其轉換為MultipartFile類型,這個與單個文件上傳一樣,不需要@RequestParam修飾。

            但是上傳多個文件時,處理器方法需要的不是MultipartFile類型,而是MultipartFile[]數組類型,默認情況下,框架會將表單中的表單元素一個個轉換為文件對象,

            但並不會將多個文件對象創建為一個數組對象。此時就需要用@RequestParam注解修飾這個數組參數,需要框架調用相應的轉換器將請求參數轉換為方法參數類型。

            所以上傳多個文件,處理器方法的MultipartFile[]數組必須使用@RequestParam注解修飾。


        2.未選擇上傳文件


            即使沒有選擇任何文件,MultipartFile[]數組也不為null。不僅不為null,其length值也大於0.

        
        因為系統會為每個file表單元素創建一個file對象。只不過沒有選擇上傳文件的這個file將不會被賦予真正的文件,只是一個為empty的File。所以對於沒有選擇任何要上傳的文件

        的情況的處理,只能逐個對文件表單元素進行判斷,判斷文件是否為empty。
           


免責聲明!

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



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