파게로그

[Spring MVC] POST 입력 - 파일 업로드 본문

콤퓨타 왕기초/Spring

[Spring MVC] POST 입력 - 파일 업로드

파게 2021. 5. 3. 05:50

웹 브라우저가 WAS 내 Servlet으로 POST를 할 때...

key1=value1&key2=value2&...로, 마치 URL의 query string과 같이 전달한다.

그런데 여기에는 문자열 외 바이너리를 포함하기는 어렵다.

이 때에는 클라이언트 인코딩을 새로 해야한다.

 

먼저, <form>의 enctype 속성 변경부터 보자.

기존에 우리는 application/x-www-form-urlencoded를 사용한다.

파일을 위해서는 URL 방식이 아니라 multipart/form-data 방식을 이용한다.

 

이를 위해 <form action="reg" method="post" enctype="multipart/form-data">로 바꾸어준다.

<input type="file" name="file"/>로 파일 업로드를 가능하도록 버튼을 만들어주면, 서버에서는 public String reg(MultipartFile file)로 받을 수 있다.

 

실행을 위해 설정을 해보자.

 

이제는 URL 방식이 아니라, 각각의 key와 value를 파트로 나누어서 아래와 같이 전달된다.

Content-Disposition: form-data; name="uid"
ddoongi

Content-Disposition: form-data; name="name"
berry

Content-Disposition: form-data; name="file"; filename="marble.jpg"
3AF90CD0D92A86.....

 

서버와 클라이언트의 기본 인코딩 방식은 둘 다 application/x-www-form-urlencoded이다.

그래서 서버에서도 변경이 필요하다.

 

multipart를 이해할 수 있도록 servlet-context.xml에 다음과 같은 내용을 추가한다.

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="314572800"/>
</bean>

docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/commons/CommonsMultipartResolver.html

 

이는 org.springframework.web.multipart.commons.CommonsFileUploadSupport를 상속받는다.

docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/commons/CommonsFileUploadSupport.html

 

 

파일마다의 사이즈, 총 파일 사이즈를 정할 수 있다.

setDefaultEncoding은 기본적인 인코딩 방식이 ISO-8859-1인데... ServletFilter를 통해 UTF-8로 바꾸어두어서 괜찮다.

 

한편 commons-fileupload commons-fileupload를 Maven dependencies에 추가해준다.

Comments