sitelink1 | https://stackoverflow.com/questions/1388...empty-list |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
sitelink5 | |
sitelink6 |
List items = upload.parseRequest(request); // items 의 list size(length) 가 0
org.apache.commons.fileupload.servlet.ServletFileUpload 클래스를 이용하여 파일을 저장할때
parseRequest(request) 함수를 실행하여 아이템 리스트를 가져오는데 해당 리스트가 비어있는 오류가 있었다. (분명 클라이언트에서는 multipart data 를 전송한 것을 확인함)
그리고 여러 테스트를 통해 parseRequest() 함수 호출전에 HttpServletRequest 객체의 parameter 를 접근하는 함수를 실행시 해당 오류가 발생함을 알게 되었다.
요청 본문을 미리 (암시적으로) 구문 분석한 경우 해당 시점에서는 요청 본문이 비어 있게 된다.
HTTP 요청 본문은 한 번만 읽고 구문 분석(read/parsed) 할 수 있다 (클라이언트가 한 번만 보냈고 여러 번 보내지 않기 때문 - sitelink1 참고)
그래서 parseRequest() 호출전에 javax.servlet.http.HttpServletRequest 클래스의 다음의 함수들이 호출되지는 않았는지 살펴봐야 한다.
- request.getParameter();
- request.getParameterMap();
- request.getParameterNames();
- request.getParameterValues();
- request.getReader();
- request.getInputStream();
- request.getParts();
이 내용은 servlet container 의 기본 동작으로 현재의 서블릿 버전(4.0) 에서도 동일한 매커니즘으로 동작하고 있다.
때문에 spring 에서는 이를 우회하기 위해 MultipartHttpServletRequest 클래스를 제공하는 것으로 보인다. (spring은 사용해보지 않아서 잘 모름)