일간에러 2021-12-20 Corrupt form data: premature ending

작성: 2021.12.20

수정: 2021.12.20

읽는시간: 00 분

Development/Daily Error

반응형

오류

innorix 파일 업로드 모듈을 진행중인 프로젝트에 붙이는 과정에 컨트롤러에서 다음과 같은 에러가 발생했다.

Corrupt form data: premature ending

샘플 코드를 WAS에 단독으로 올려서 테스트 해봤을 때에는 문제없이 작동 되는걸 확인 했는데, 스프링 부트 프로젝트에서 모듈을 붙이려니 자꾸 에러가 발생했다. 심지어는 샘플 코드를 그대로 붙여 넣어 테스트 해보아도 같은 에러가 발생했다.

번역을 그대로 해 보면, 데이터가 손상되었고 조기에 종료 되었다는 내용이다.

원인

에러가 나는 코드를 타고 들어가보니, MultipartRequest를 모듈 내부에서 readNextPart() 돌리며 스스로 처리 하고 있었다. 스프링에서 익숙 하게 사용 하는 List<MultipartFile> files 방식을 사용는게 아니었다.

헌데, Spring이 먼저 필터로 MultiPartFile을 스스로 처리해버리고 나니 request의 스트림은 이미 읽힌 상태로 전달 되버리기 때문에 당연히 에러가 발생 하는 것 이었다.

해결

모듈이 자체적으로 MultiPartFile 요청을 처리 해 주니 그걸 믿고 스프링에서의 MultiPart 처리를 비활성화 시켜줘야 한다.

application.yml 파일 (application.properties) 에서 multipart를 비활성화 시킬 수 있는데, 해당 설정은 true가 default값이기 때문에 true로 명시적으로 선언 되어 있지 않더라도 꼭 false를 기입 해 주어야만 끌 수 있다.

SpringBoot1.x 버전

spring.http.multipart:
  enabled: false

SpringBoot 2.x 버전에서는 spring.servlet.multipart로 경로가 변경되었다.

spring.servlet.multipart:
  enabled: false

혹은 레거시 스프링 프로젝트 라면 web.xml에 MultipartFilter를 직접 추가했을텐데, 아래의 필터를 제거하거나 url-pattern을 손보면 될 듯 하다.

 <filter>
  <filter-name>multipart</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
 </filter>

 <filter-mapping>
    <filter-name>multipart</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

이후 코드를 다시 작동 시켜보면

image-20211220165022785

더이상 에러가 발생 하지 않고 파일 업로드를 정상적으로 처리하는 것을 확인 할 수 있다.

분명 Spring을 처음 해울때 MultiPart를 직접 처리도 해보고, 필터도 손수 만들어 보며 배웠던 게 기억이 나는데.. 이번 버그를 해결하며, 잘 가르쳐 주셨던 선생님에게 감사한 마음도 들며 다른 한편으로는 배운거에 끙끙대니 죄송한 마음도 들었다.

반응형