001/* 002 * Copyright 2012-2018 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.springframework.boot.autoconfigure.web.servlet; 018 019import javax.servlet.MultipartConfigElement; 020import javax.servlet.Servlet; 021 022import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 023import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 024import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 025import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 026import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; 027import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type; 028import org.springframework.boot.context.properties.EnableConfigurationProperties; 029import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; 030import org.springframework.context.annotation.Bean; 031import org.springframework.context.annotation.Configuration; 032import org.springframework.web.multipart.MultipartResolver; 033import org.springframework.web.multipart.commons.CommonsMultipartResolver; 034import org.springframework.web.multipart.support.StandardServletMultipartResolver; 035import org.springframework.web.servlet.DispatcherServlet; 036 037/** 038 * {@link EnableAutoConfiguration Auto-configuration} for multi-part uploads. Adds a 039 * {@link StandardServletMultipartResolver} if none is present, and adds a 040 * {@link javax.servlet.MultipartConfigElement multipartConfigElement} if none is 041 * otherwise defined. The {@link ServletWebServerApplicationContext} will associate the 042 * {@link MultipartConfigElement} bean to any {@link Servlet} beans. 043 * <p> 044 * The {@link javax.servlet.MultipartConfigElement} is a Servlet API that's used to 045 * configure how the server handles file uploads. 046 * 047 * @author Greg Turnquist 048 * @author Josh Long 049 * @author Toshiaki Maki 050 */ 051@Configuration 052@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, 053 MultipartConfigElement.class }) 054@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true) 055@ConditionalOnWebApplication(type = Type.SERVLET) 056@EnableConfigurationProperties(MultipartProperties.class) 057public class MultipartAutoConfiguration { 058 059 private final MultipartProperties multipartProperties; 060 061 public MultipartAutoConfiguration(MultipartProperties multipartProperties) { 062 this.multipartProperties = multipartProperties; 063 } 064 065 @Bean 066 @ConditionalOnMissingBean({ MultipartConfigElement.class, 067 CommonsMultipartResolver.class }) 068 public MultipartConfigElement multipartConfigElement() { 069 return this.multipartProperties.createMultipartConfig(); 070 } 071 072 @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) 073 @ConditionalOnMissingBean(MultipartResolver.class) 074 public StandardServletMultipartResolver multipartResolver() { 075 StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver(); 076 multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily()); 077 return multipartResolver; 078 } 079 080}