SpringMVC使用MultipartFile上傳文件


1. MultipartFile基本介紹

MultipartFile是springmvc官方提供的一個比較完善的文件上傳組件,MultipartFile是一個組織接口它的實現類有

  • org.springframework.web.multipart.commons.CommonsMultipartFile
  • org.springframework.mock.web.MockMultipartFile    

它在springmvc中的org.springframework.web.multipart這個包內,與org.springframework.web.multipart.commonsorg.springframework.web.multipart.support包內的類接口組合使用該。在本文中我們來說說如何在SSM整合中使用該類主鍵上傳文件,和如何同時上傳多個文件。

2. 准備工作

 在寫上傳接口之前必須先加入流的依賴

<!-- 上傳文件依賴組件 -->
    <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>
    
       <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.2</version>
    </dependency>

如果在依賴jar上有不是只要加入commons-fileupload的問題,在這里要解釋下。因為這個jar包1.0 版本到1.1版本的時候把org.apache.commons.io.output.DeferredFileOutputStream.class移除了,所以要使用commons-io這個jar中的這個類來彌補。所以說如果上傳你碰到這個問題

HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream,那就趕緊加入那個依賴吧。

 

光加入依賴還是遠遠不夠的,在前台頁面也需要改不然后台接收不到數據。默認的form提交是application/x-www-form-urlencoded而上傳文件是把文件用2進制的方式傳輸默認的格式已經滿足不了需求,就需要使用multipart/form-data格式來發送接收。

1)  在form中加入 enctype="multipart/form-data"

<form action="admin/upload_theme.do" method="post" enctype="multipart/form-data">
     <input type="file" name="meFile" /><p>
     <input type="submit" value="提交" /><p>
     <input type="reset" value="清空" /><p>
</form>

2)上傳多文件的話,需在表單的input中加入multiple="multiple"。(可一次選擇多個文件)

<form action="admin/upload_theme.do" method="post" enctype="multipart/form-data">
        <input type="file" name="meFile" multiple="multiple" /><p>
        <input type="submit" value="提交" /><p>
        <input type="reset" value="清空" /><p>
</form>

3)上傳文件夾的話,需在表單input中加入webkitdirectory directory。(僅可以選擇文件夾,文件夾內的文件也能成功上傳)

<form action="admin/upload_theme.do" method="post" enctype="multipart/form-data">
        <input type="file" name="meFile" multiple="multiple" webkitdirectory directory /><p>
        <input type="submit" value="提交" /><p>
        <input type="reset" value="清空" /><p>
</form>

頁面寫好了,還有一個重要的步奏:

設置虛擬文件夾,這是用來存放上傳上來的文件。

 

1)雙擊進入服務器的設置頁面

 

2)點擊add添加虛擬本地的虛擬目錄

 

好了准備工作做好了,可以開始寫后台業務邏輯。

3.后台代碼

 1)單文件上傳,注意MultipartFile的實例名要與頁面中表單的name值一致。

@RequestMapping("/upload_theme.do")//上傳主題
    public String UploadTheme(MultipartFile meFile,Model model){
        if (meFile != null) {
            System.out.println(meFile.getContentType());//在控制台打印文件的類型
            System.out.println(meFile.getName());//返回文件的名稱
            System.out.println(meFile.getOriginalFilename());//返回文件的原文件名
            try {
                meFile.transferTo(new File("G:/temp/"+UUID.randomUUID()+meFile.getOriginalFilename()));
            } catch (IllegalStateException e) {
                e.printStackTrace();
                model.addAttribute("msg", "上傳失敗");
                return "/error.jsp";
            } catch (IOException e) {
                e.printStackTrace();
                model.addAttribute("msg", "上傳失敗");
                return "/error.jsp";
            }
        }
        model.addAttribute("msg", "上傳成功");
        return "index";
    }

 

2)多文件上傳,注意頁面表單寫上面說到的屬性。不然不能選擇多個,和選擇文件夾。(頁面加入webkitdirectory directory  multiple="multiple"

 

@RequestMapping("/upload_theme.do")//上傳主題
    public String UploadTheme(HttpServletRequest request,Model model){
        CommonsMultipartResolver cResolver = new CommonsMultipartResolver();
        if (cResolver.isMultipart(request)) {//判斷是不是Multipart格式的數據
            MultipartHttpServletRequest httpservletrequest = (MultipartHttpServletRequest) request;//將文件格式的請求裝入MultipartHttpServletRequest對象中。
            List<MultipartFile> list = httpservletrequest.getFiles("meFile");//通過調用該方法取出文件到list
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i).getOriginalFilename());
                System.out.println(list.get(i).getContentType());
                try {
                    list.get(i).transferTo(new File("G:/temp/"+UUID.randomUUID()+list.get(i).getOriginalFilename()));
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                    model.addAttribute("msg", "上傳失敗");
                    return "/error.jsp";
                } catch (IOException e) {
                    e.printStackTrace();
                    model.addAttribute("msg", "上傳失敗");
                    return "/error.jsp";
                }
            }
        }
        model.addAttribute("msg", "上傳成功");
return "index"; }

點擊提交文件夾

 

文件的原文件名和文件格式都打印出來了

 

4.最后 

 這上傳技術分享就到這里了,看到的小伙伴有問題要不吝言辭哦。寫出來不容易,點個贊吧,謝謝支持!

 Spring Api : https://docs.spring.io/spring/docs/current/javadoc-api/

 

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

剛發現補充一點(spring-servlet.xml中的配置):

 <!-- 上傳文件配置 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
         <property name="defaultEncoding" value="UTF-8" />
         <!-- 指定所上傳文件的總大小,單位字節。注意maxUploadSize屬性的限制不是針對單個文件,而是所有文件的容量之和 -->
         <property name="maxUploadSize" value="10240000" /><!-- 上傳的最大size  -->
         <property name="maxInMemorySize" value="4096" />
         <property name="resolveLazily" value="true" /><!-- 懶接收 -->
    </bean>

還需要這段配置,才能完成上傳操作。


免責聲明!

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



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