Spring Boot 檔案上傳原理解析,spring檔案上傳

來源:互聯網
上載者:User

Spring Boot 檔案上傳原理解析,spring檔案上傳

首先我們要知道什麼是Spring Boot,這裡簡單說一下,Spring Boot可以看作是一個架構中的架構--->整合了各種架構,像security、jpa、data、cloud等等,它無須關心配置可以快速啟動開發,有興趣可以瞭解下自動化配置實現原理,本質上是 spring 4.0的條件化配置實現,深拋下註解,就會看到了。

  說Spring Boot 檔案上傳原理 其實就是Spring MVC,因為這部分工作是Spring MVC做的而不是Spring Boot,那麼,SpringMVC又是怎麼處理檔案上傳這個過程的呢?

  圖:

  首先項目啟動相關配置,再執行上述第二步的時候 DispatcherServlet會去尋找id為multipartResolver的Bean,在配置中看到Bean指向的是CommonsMultipartResolve,其中實現了MultipartResolver介面。

  第四步驟這裡會判斷是否multipart檔案即isMultipart方法,返回true:就會調用 multipartResolver 方法,傳遞HttpServletRequest會返回一個MultipartHttpServletRequest對象,再有DispatcherServlet進行處理到Controller層;返回false:會忽略掉,繼續傳遞HttpServletRequest。

  在MVC中需要在設定檔webApplicationContext.xml中配置 如下:

  <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">      <property name="defaultEncoding" value="UTF-8"/>      <property name="maxUploadSize" value="100000000"/>      <property name="uploadTempDir" value="fileUpload/temp"/>  </bean>

  而Spring Boot已經自動設定好,直接用就行,做個test沒什麼問題。有預設的上傳限制大小,不過在實際開發中我們還是做一些配置的,

如下在application.properties中:

# multipart config#預設支援檔案上傳spring.http.multipart.enabled=true#檔案上傳目錄spring.http.multipart.location=/tmp/xunwu/images/#最大支援檔案大小spring.http.multipart.max-file-size=4Mb#最大支援要求大小spring.http.multipart.max-request-size=20MB

當然也可以寫配置類來實現,具體的就不做展示了。

  看完上述你肯定有個大概的瞭解了,這裡再囉嗦下,Spring提供Multipart的解析器:MultipartResolver,上述說的是CommonsMultipartResolver,它是基於Commons File Upload第三方來實現,這也是在Servlet3.0之前的東西,3.0+之後也可以不需要依賴第三方庫,可以用StandardServletMultipartResolver,同樣也是實現了MultipartResolver介面,我們可以看下它的實現:

* Copyright 2002-2017 the original author or authors.package org.springframework.web.multipart.support;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.Part;import org.apache.commons.logging.LogFactory;import org.springframework.web.multipart.MultipartException;import org.springframework.web.multipart.MultipartHttpServletRequest;import org.springframework.web.multipart.MultipartResolver;/** * Standard implementation of the {@link MultipartResolver} interface, * based on the Servlet 3.0 {@link javax.servlet.http.Part} API. * To be added as "multipartResolver" bean to a Spring DispatcherServlet context, * without any extra configuration at the bean level (see below). * * <p><b>Note:</b> In order to use Servlet 3.0 based multipart parsing, * you need to mark the affected servlet with a "multipart-config" section in * {@code web.xml}, or with a {@link javax.servlet.MultipartConfigElement} * in programmatic servlet registration, or (in case of a custom servlet class) * possibly with a {@link javax.servlet.annotation.MultipartConfig} annotation * on your servlet class. Configuration settings such as maximum sizes or * storage locations need to be applied at that servlet registration level; * Servlet 3.0 does not allow for them to be set at the MultipartResolver level. * * @author Juergen Hoeller * @since 3.1 * @see #setResolveLazily * @see HttpServletRequest#getParts() * @see org.springframework.web.multipart.commons.CommonsMultipartResolver */public class StandardServletMultipartResolver implements MultipartResolver {  private boolean resolveLazily = false;  /**   * Set whether to resolve the multipart request lazily at the time of   * file or parameter access.   * <p>Default is "false", resolving the multipart elements immediately, throwing   * corresponding exceptions at the time of the {@link #resolveMultipart} call.   * Switch this to "true" for lazy multipart parsing, throwing parse exceptions   * once the application attempts to obtain multipart files or parameters.   */  public void setResolveLazily(boolean resolveLazily) {    this.resolveLazily = resolveLazily;  }  @Override  public boolean isMultipart(HttpServletRequest request) {    // Same check as in Commons FileUpload...    if (!"post".equals(request.getMethod().toLowerCase())) {      return false;    }    String contentType = request.getContentType();    return (contentType != null && contentType.toLowerCase().startsWith("multipart/"));  }  @Override  public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {    return new StandardMultipartHttpServletRequest(request, this.resolveLazily);  }  @Override  public void cleanupMultipart(MultipartHttpServletRequest request) {    // To be on the safe side: explicitly delete the parts,    // but only actual file parts (for Resin compatibility)    try {      for (Part part : request.getParts()) {        if (request.getFile(part.getName()) != null) {          part.delete();        }      }    }    catch (Throwable ex) {      LogFactory.getLog(getClass()).warn("Failed to perform cleanup of multipart items", ex);    }  }}

這裡是之前寫的test的後者實現配置類,可以簡單看下,作為瞭解:

package com.bj.config;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.autoconfigure.web.MultipartProperties;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.multipart.MultipartResolver;import org.springframework.web.multipart.support.StandardServletMultipartResolver;import org.springframework.web.servlet.DispatcherServlet;import javax.servlet.MultipartConfigElement;@Configuration@EnableConfigurationProperties(MultipartProperties.class)public class FileUploadConfig {  private final MultipartProperties multipartProperties;  public FileUploadConfig(MultipartProperties multipartProperties){    this.multipartProperties=multipartProperties;  }  /**   * 註冊解析器   * @return   */  @Bean(name= DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)  @ConditionalOnMissingBean(MultipartResolver.class)  public StandardServletMultipartResolver multipartResolver(){    StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();    multipartResolver.setResolveLazily(multipartProperties.isResolveLazily());    return multipartResolver;  }  /**   * 上傳配置   * @return   */  @Bean  @ConditionalOnMissingBean  public MultipartConfigElement multipartConfigElement(){    return this.multipartProperties.createMultipartConfig();  }}

總結

以上所述是小編給大家介紹的Spring Boot 檔案上傳原理解析,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對幫客之家網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.