Spring Boot 파일 업로드 원리 분석
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 파일 업로드 원리 해석 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.