출처: https://dawnisthm.tistory.com/entry/Struts-2-14-interceptor-–-fileUpload-개요 [Dawnist Note]
fileUpload인터셉터는 웹 페이지에서 파일을 쉽고 편하게 업로드 할 수 있도록 해주는데 fileUpload인터셉터를 이용하기 위해서는 multipart parser를 지정해 주어야 한다. 사용 가능한 parser로는 cos, pell, jakarta등이 있는 데 여기서는 jakarta를 사용해 보도록 하자. 이를 위해서는 commons-fileupload.jar, commons-io.jar 라이브러리가 필요하다.
파일 업로드와 관련된 설정은 세가지가 있는데 먼저 default.properties에 기본값이 설정되어 있다.
(struts2-core-2.0.14.jar 파일 내의 org\apache\struts2아래에 있다)
[default.properties]
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152
struts.properties 또는 struts.xml에서 이 값을 오버라이드 할 수 있다.
[struts.properties에서 오버라이드]
struts.multipart.parser=jakarta
struts.multipart.saveDir=/tmp
struts.multipart.maxSize=10240000 #최대 10메가 지정
[struts.xml에서 오버라이드]
<struts>
<constant name="struts.multipart.parser" value="Jakarta"/>
<constant name="struts.multipart.saveDir" value="/tmp"/>
<constant name="struts.multipart.maxSize" value="10240000"/>
</struts>
fileUpload인터셉터는 파일을 임시디렉토리에 업로드하고 그 객체와 컨텐트타입, 그리고 원본파일명을 Action의 Property로 저장한다. 그런 다음 Action이 종료 된 후 임시디렉토리의 파일을 삭제한다. 따라서 Action에는 위 3개의 프로퍼티에 대한 setter가 만들어져 있어야 하며 Action에서는 임시디렉토리의 파일을 실제 저장할 디렉토리로 복사하는 단순한 일만 하면 된다. 멀티파트 폼을 생성하고 파일을 업로드 하는 등의 일은 fileUpload인터셉터가 모두 해 주는 것이다.
fileUpload인터셉터에 선택적으로 추가할 수 있는 파라미터는 maximumSize, allowedTypes 두개의 param 값이 있는데 다음과 같다.
<action…>
<interceptor-ref name="fileUpload" />
<param name=" maximumSize">1024</param>
<param name=" allowedTypes">text/html, application/pdf</param>
</interceptor>
</action>
maximumSize는 업로드 가능한 파일의 크기를 제한하며 allowedTypes 파라미터는 업로드 가능한 ContentType을 제한 할 수 있다.
그런데 업로드 가능한 파일의 크기는 struts.properties에서도 struts.multipart.maxSize 값으로 설정 했었는데 struts.properties 파일과 인터셉터파라미터를 이용하는 경우 약간의 차이가 있다.
struts.properties파일에 최대 업로드 사이즈를 지정하면 commons-fileupload 라이브러리에 포함되어 있는 ServletFileUpload 클래스의 setSizeMax(long sizeMax) 메소드를 이용하여 최대값이 세팅되는데 이 경우 지정된 크기보다 큰 사이즈의 파일이 업로드 되면 commons-fileupload 라이브러리에서 예외가 발생하고 Struts2 프레임워크에서는 발생한 예외 메시지를 Action Level Error로 추가한다. 물론 Action에 에러메시지를 추가하기 위해서는 Action이 ValidationAware 인터페이스를 구현하거나 ActionSupport 클래스를 상속해야 한다. 만약 Action Level 에러가 있는 경우 workflow 인터셉터를 붙이면 Action을 실행하지 않고 input 화면으로 돌아간다.
화면에서는 다음과 같이 Action Error메시지를 출력가능하다.
${actionErrors[0]}
한편 인터셉터의 파라미터로 업로드 파일의 최대 사이즈를 지정하면 commons-fileuplaod를 이용하여 이미 파일이 업로드 된 후 파일 크기가 maximunSize 보다 크면 파일을 삭제하고 필드 에러 메시지를 저장한다. Default 메시지는 다음과 같다.
(struts2-core-2.0.14.jar 파일 내의 org\apache\struts2\struts-messages.properties)
# 업로드된 파일 객체가 NULL인 경우
struts.messages.error.uploading=Error uploading: {0}
#최대 크기가 넘어가는 경우
struts.messages.error.file.too.large=File too large: {0} "{1}" {2}
#ContentType이 허가되지 않은 것인 경우
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" {2}
{0} : form의 input name
{1} : 업로드된 임시 파일
{2} : 파일크기 또는 컨텐트 타입
struts.xml에 다음과 같이 struts.custom.i18n.resources 값을 설정해 메시지 리소스 파일을 지정하는 것도 가능하다.
<constant name=" struts.custom.i18n.resources" value="messages"/>
위와 같이 설정할 경우 WEB-INF/src에 messages.properties 파일을 만들고 struts-
messages.properties 파일을 오버라이드 하면 된다.
https://m.cafe.daum.net/OakHouse/ODbs/319?q=jdbc&
Unable to find 'srtuts.multipart.saveDir' property setting
파일업로드 부분을 하다가 Unable to find 'srtuts.multipart.saveDir' property setting이라는 에러가 나오면서
파일도 업로드가 안되는 겁니다.
테스트할때 ModelDriven없이 할때는 잘 되었는데 왜 그러지? ModelDriven을 쓰지말아야하나? ㅠ
주말내내 고민이었던 문제가 선생님께 질문한지 5분만에 알게되었네요 ㅎ 감사합니다^0^
원인은
① commons-io-1.3.2.jar, commons-fileupload-1.2.jar 파일이 없거나 -->전 있었음 ㅎ
② struts.xml에 <interceptor-ref name="fileUpload"/>를 추가해줍니다.
-->이것만해도 파일업로드는 되더라구요 ㅎ 하지만 Unable to find 'srtuts.multipart.saveDir' property setting이라는 에러는 계속 ㅠ
③ struts.properties에
struts.multipartparser=Jakarta
struts.multipart.saveDir=c:\\temp
struts.multipart.maxSize=2097152
이녀석들 추가하니 잘되네요 ㅎ
모두 열프하세요~~