Spring Boot 파일 업로드 원리 분석

먼저 우 리 는 Spring Boot 가 무엇 인지 알 아야 한다.여기 서 간단하게 말 하면 Spring Boot 는 하나의 프레임 워 크 중의 프레임 워 크 로 볼 수 있다.예 를 들 어 security,jpa,data,cloud 등 각종 프레임 워 크 를 통합 시 켰 다.이 는 설정 에 관심 을 가지 지 않 아 도 개발 을 신속하게 시작 할 수 있 고 관심 이 있 으 면 자동화 배치 실현 원 리 를 풀 수 있다.본질 적 으로 spring 4.0 의 조건 화 배치 실현 이다.주 해 를 깊이 던 지면 볼 수 있다.
Spring Boot 파일 업로드 원 리 는 Spring MVC 라 고 합 니 다.이 부분 은 Spring MVC 가 아 닌 Spring MVC 가 하 는 작업 이기 때 문 입 니 다.그러면 SpringMVC 는 파일 업로드 과정 을 어떻게 처리 합 니까?
그림:

먼저 프로젝트 가 관련 설정 을 시작 하고 상기 두 번 째 단 계 를 실행 할 때 Dispatcher Servlet 은 id 가 multipartResolver 인 Bean 을 찾 습 니 다.설정 에서 Bean 이 가리 키 는 것 은 Commons MultipartResolve 이 고 그 중에서 MultipartResolver 인 터 페 이 스 를 실현 합 니 다.
네 번 째 단 계 는 multipart 파일 이 isMultipart 방법 인지 판단 하고 true 로 돌아 갑 니 다.multipart Resolver 방법 을 호출 합 니 다.Http ServletRequest 를 전달 하면 Multipart Http ServletRequest 대상 을 되 돌려 주 고 Dispatcher Servlet 을 사용 하여 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 의 해석 기 를 제공 합 니 다.Multipart Resolver.위 에서 말 한 것 은 Commons Multipart Resolver 입 니 다.Commons File Upload 제3자 에 의 해 이 루어 집 니 다.이것 도 Servlet 3.0 이전의 것 입 니 다.3.0+이후 에 도 제3자 라 이브 러 리 에 의존 하지 않 아 도 됩 니 다.Standard Servlet MultipartResolver 를 사용 할 수 있 습 니 다.또한 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 파일 업로드 원리 해석 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기