SpringMVC處理multipart請求.

1、簡述

    multipart格式的數據會將一個表單拆分爲多個部分(part),每一個部分對應一個輸入域。在通常的表單輸入域中,它所對應的部分中會放置文本型數據,可是若是上傳文件的話,它所對應的部分能夠是二進制。相似這樣:前端

2、配置multipart解析器

    儘管multipart請求看起來很複雜,但在Spring MVC中處理它們卻很容易。在編寫控制器方法處理文件上傳以前,咱們必需要配置一個multipart解析器,經過它來告訴DispatcherServlet該如何讀取multipart請求。web

   Spring 內置了兩個MultipartResolver的實現:spring

  • CommonsMultipartResolver:使用Jakarta Commons FileUpload解析multipart請求;
  • StandardServletMultipartResolver:依賴於Servlet 3.0對multipart請求的支持(始於Spring 3.1)。

一、StandardServletMultipartResolver的配置:    後端

 (1) 聲明Bean:數組

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver
在applicationContext.xml 配置
        @Bean(name = "multipartResolver")
        public StandardServletMultipartResolver getStandardServletMultipartResolver(){
                return new StandardServletMultipartResolver();
        }
在配置類中配置

tips:multipart解析器的命名必定要是 multipartResolver ,不然會報錯。app

(2) 配置上傳參數:ide

    * web.xml 配置post

  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <multipart-config>
        <!--上傳到/tmp/upload 目錄-->
      <location>/tmp/upload</location>
        <!--文件大小爲2M-->
      <max-file-size>2097152</max-file-size>
        <!--整個請求不超過4M-->
      <max-request-size>4194304</max-request-size>
        <!--全部文件都要寫入磁盤-->
      <file-size-threshold>0</file-size-threshold>
    </multipart-config>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
View Code

    * 配置類中配置 url

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        //上傳到/tmp/upload 目錄,文件大小爲2M,整個請求不超過4M,並且全部文件都要寫入磁盤
        registration.setMultipartConfig(new MultipartConfigElement("E:\\upload_ftp",2097152,4194304,0));
    }
繼承 AbstractAnnotationConfigDispatcherServletInitializer 的配置類 

二、CommonsMultipartResolver的配置:spa

 (1) 聲明Bean 和 配置上傳參數

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
       <!--設置上傳目錄/tmp/upload;最大的文件容量設置爲2M;最大的內存大小設置爲0,表示全部文件都會寫入磁盤中;沒法設定multipart請求總體的最大容量-->
        <property name="uploadTempDir" value="/tmp/upload"/>
        <property name="maxUploadSize" value="2097152"/>
        <property name="maxInMemorySize" value="0"/>
    </bean>
在applicationContext.xml中設置

三、區別:

       (1) CommonsMultipartResolver 相比較 StandardServletMultipartResolver 來講 就是沒法設定multipart請求總體的最大容量。

       (2) CommonsMultipartResolver不會強制要求設置臨時文件路徑。默認狀況下,這個路徑就是Servlet容器的臨時目錄。 StandardServletMultipartResolver 必須設置臨時文件路徑才能正常執行。(以上所述上傳目錄均爲臨時文件路徑)

3、SpringMVC 處理請求

一、前端Form 表單

      <form action="/picture" method="post" enctype="multipart/form-data">
          <input type="file" name="picture">
          <input type="submit">
      </form>
View Code

tips:須要設置 enctype="multipart/form-data",以告訴SpringMVC 這是一個Multipart 請求。

二、後端MVC接受請求

    @RequestMapping(value = "/picture",method = RequestMethod.POST)
    public String getHome(@RequestPart("picture") MultipartFile picture) throws IOException {
        String name = picture.getName();
        byte[] bytes = picture.getBytes();
        picture.transferTo(new File("/"+picture.getOriginalFilename())); 
        //這裏保存到文件系統的時候要用相對路徑,好比這裏配置的是 /。以配置的上傳目錄爲基準。即文件路徑 E:/upload_ftp/ 是保存的目錄
        return "home";
    }
View Code

tips:(1) @RequestPart("picture") :當註冊表單提交的時候,picture屬性將會給定一個byte數組,這個數組中包含了請求中對應part的數據(經過@RequestPart指定)。若是用戶提交表單的時候沒有選擇文件,那麼這個數組會是空(而不是null)。因此說咱們甚至能夠用byte[]數組接收Multipart請求而不用 MultipartFile 也是能夠的。

          (2) MultipartFile :用MultipartFile方法接收爲咱們提供了不少的方法以便進行接下來的工做...

三、Part的形式接受上傳的文件
       就主體來言,Part接口與MultipartFile並無太大的差異。 在不少狀況下,Part方法的名稱與MultipartFile方法的名稱是徹底相同的。有一些比較相似,可是稍有差別,好比getSubmittedFileName()對應於getOriginalFilename()。相似地,write()對應於transferTo(),藉助該方法咱們可以將上傳的文件寫入文件系統中。

       值得一提的是,若是在編寫控制器方法的時候,經過Part參數的形式接受文件上傳,那麼就沒有必要設置MultipartResolver 了。只有使用MultipartFile的時候,咱們才須要MultipartResolver。

    @RequestMapping(value = "/picture",method = RequestMethod.POST)
    public String getHome(@RequestPart("picture") Part picture) throws IOException {
        picture.write("/"+picture.getSubmittedFileName());
        return "home";
    }
相關文章
相關標籤/搜索