springframework

파일 업로드의 기본 설정

Jungsoomin :) 2020. 9. 6. 23:23

일단 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로 해준다는 것

 

이렇게 나누어 볼 수 있을 것 같다.