일단 commons-fileupload 나 servlet 3.0 이상의 스펙 중 하나로 결정하고 설정한다.
javax.servlet-api 스펙이 3.0 이상일때는 web.xml 설정을잡고, StandardServletMultipartResolver 빈 객체를 등록한다.
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<location>C:\\upload\\temp</location>
<max-file-size>20971520</max-file-size>
<max-request-size>41943040</max-request-size>
<file-size-threshold>20971520</file-size-threshold>
</multipart-config>
</servlet>
servlet-context.xml 에서는 StandartServletMultipartResolver 클래스를 빈으로 등록한다.
아이디는 반드시 multipartResolver 이다.
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</beans:bean>
javaConfig
web.xml 을 대신하려면 AbstractAnnotationConfigDispatcherServletInitializer 를 상속하는 클래스가 필요하며, <servlet> 태그안의 내용을 수정하고 있으므로 customizeRegistration(Dynamic dynamic) 메서드를 재정의 해서 설정한다.
<multipart-config> 태그는 MultipartConfigElement 클래스로 대체되어 해당 클래스에 매개값에 파일 업로드에 대한 설정 값을 매개값으로 주고
setMultipartConfigElement() 메서드의 매개값으로 넘겨준다.
import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new CharacterEncodingFilter() };
}
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setInitParameter("throwExceptionIfNoHanlderFound", "true");
MultipartConfigElement configElement = new MultipartConfigElement("C:\\upload\\temp", 20971520, 41943040,
20971520);
registration.setMultipartConfig(configElement);
}
}
spring-mvc 설정클래스에서는 StandardServletMultipartResolver 클래스를 빈객체로 등록해준다.
@Configuration
public class WebConfig {
@Bean
public MultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
return multipartResolver;
}
}
commons-fileupload 를 사용할 경우 CommonsMultipartResolver 클래스를 빈으로 등록해 사용한다.
pom.xml
<!-- Commons-Fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
servlet-context.xml
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="utf-8"/>
<beans:property name="uploadTempDir" value="file:/C:/upload/tmp"/>
<beans:property name="maxUploadSizePerFile" value="2097152"/>
<beans:property name="maxUploadSize" value="104857560"/>
<beans:property name="maxInMemorySize" value="10485756"/>
</beans:bean>
javaConfig spring-mvc @Configuration 클래스
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() throws IOException {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();//파일 업로드 시 사용하는 객체
resolver.setDefaultEncoding("utf-8");//한글깨짐현상방지
resolver.setMaxInMemorySize(1024*1024);//해당 메모리를 넘어서면 임시저장
resolver.setUploadTempDir(new FileSystemResource("C:\\upload\\tmp"));// 임시저장될 경로 디렉토리
resolver.setMaxUploadSize(1024*1024*10);//하나의 Request 에 업로드할 수 있는 최대 파일 크기
resolver.setMaxUploadSizePerFile(1024*1024*2);//하나의 파일당 업로드 할 수 있는 최대 파일 크기
return resolver;
}
크게 나누어 보자면
Servlet3.0 이상에서 제공하는 파일 업로드를 이용하기위해서는 web.xml의 <servlet> 태그 안에 <multipart-config> 설정을 해주는것, StandardServletMultipartResolver 빈을 만들며 이름은 반드시 multipartResolver라는 것.
commons-fileupload 를 이용하기 위해서는 CommonsMultipartResolver 클래스 빈을 만들며 이름은 반드시 multipartResolver 라는 것 , 파일 설정을 내부에서 setter로 해준다는 것
이렇게 나누어 볼 수 있을 것 같다.
'springframework' 카테고리의 다른 글
파일업로드의 고민점, (지속적으로 추가 예정..) (0) | 2020.09.07 |
---|---|
MultipartFile 의 메서드 (0) | 2020.09.06 |
AOP 의 @Before ,@AfterThrowing, @AfterReturning, @Around (0) | 2020.09.04 |
o.s.w IoC 핵심기술. Validation 추상화 (0) | 2020.08.25 |
o.s.w IoC 핵심기술. Resource 추상화 (0) | 2020.08.24 |