N개의 input-file 파일 업로드 처리방법
- 작성자 :
- 김*솔
- 작성일 :
- 2011-12-23 19:48:52
- 조회수 :
- 2,322
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
egovframework 1.0을 사용중 입니다.
현재 첨부파일 처리로 EgovMultipartResolver 를 사용중 입니다.
제가 원하는건 아래와 같이 도서정보로써 표지 이미지 1개, 목차 이미지 N개를 업로드하고 싶습니다.
form
표지 이미지 :
input type="file" name="coverImg" /
목차 이미지 :
input type="file" name="tocImg" /
input type="file" name="tocImg" /
input type="file" name="tocImg" /
input type="file" name="tocImg" /
/form
EgovMultipartResolver는 맵에 '업로드시 로컬 파일명'을 키로 저장하기 때문에 위 기능을 구현할 수 없습니다.
파일선택시 표지이미지로 '표지.jpg' 라는 파일을 선택하라고 강요할 순 없으니까요.
이에 대한 대안/해결책을 알고 싶습니다.
----- 아래는 제가 시도한 방법 입니다. -----
1. CommonsMultipartResolver 를 사용한다.
- 동일한 name(결과적으로 맵의 1개의 키)에 배열로써 값을 저장 할 수 없다.
- name 애트리뷰트를 다 다르게 할 경우 N개의 파일업로드시 뷰(jsp)에서 js를 통해서간 컨트롤해야하는 불편함이 있다.
2. CommonsMultipartResolver 를 수정해 배열이 저장되게 한다.
- 이미 많은 모듈에서 당연히 egovframework.com.cmm.service.EgovFileMngUtil 을 사용중인데, Map<String, MultipartFile> 을 처리하는 것으로 되어 있다.
- EgovFileMngUtil 에 메서드를 추가하거나 다른 클래스를 생성하는 건 다른 모듈과 일관성이 없다.
3. CommonsMultipartResolver 를 수정해 동일 name(key)에 대해 접미사를 붙여 저장되게 한다.
- input-file 의 name이 1개뿐이라면 name이 키가 되고, 2개이상일 경우 name, name_1, name_2, ... 이 되게한다.
- 물론 여전히 메서드를 추가해야하지만 2번의 경우보다 그 범위가 훨씬 작다.
4. 필요에 따라 리졸버를 다르게 혹은 CommonFileUpload 를 직접 사용한다.
- 차라리 2번의 방법을 통해 소스코드 전체를 수정해서 일관성을 갖게하지 설정 또는 aop를 통해 일부 모듈만 예외를 두는건 바람직하지 않다.
현재는 3번의 방법으로 처리하려 합니다.
제가 지식이 부족해 어떤 방법이 좋을지도, 좋은 해결책도 못찾고 있습니다.
해서 다른 대안책을 듣고 싶습니다.
이상입니다. 감사합니다.
현재 첨부파일 처리로 EgovMultipartResolver 를 사용중 입니다.
제가 원하는건 아래와 같이 도서정보로써 표지 이미지 1개, 목차 이미지 N개를 업로드하고 싶습니다.
form
표지 이미지 :
input type="file" name="coverImg" /
목차 이미지 :
input type="file" name="tocImg" /
input type="file" name="tocImg" /
input type="file" name="tocImg" /
input type="file" name="tocImg" /
/form
EgovMultipartResolver는 맵에 '업로드시 로컬 파일명'을 키로 저장하기 때문에 위 기능을 구현할 수 없습니다.
파일선택시 표지이미지로 '표지.jpg' 라는 파일을 선택하라고 강요할 순 없으니까요.
이에 대한 대안/해결책을 알고 싶습니다.
----- 아래는 제가 시도한 방법 입니다. -----
1. CommonsMultipartResolver 를 사용한다.
- 동일한 name(결과적으로 맵의 1개의 키)에 배열로써 값을 저장 할 수 없다.
- name 애트리뷰트를 다 다르게 할 경우 N개의 파일업로드시 뷰(jsp)에서 js를 통해서간 컨트롤해야하는 불편함이 있다.
2. CommonsMultipartResolver 를 수정해 배열이 저장되게 한다.
- 이미 많은 모듈에서 당연히 egovframework.com.cmm.service.EgovFileMngUtil 을 사용중인데, Map<String, MultipartFile> 을 처리하는 것으로 되어 있다.
- EgovFileMngUtil 에 메서드를 추가하거나 다른 클래스를 생성하는 건 다른 모듈과 일관성이 없다.
3. CommonsMultipartResolver 를 수정해 동일 name(key)에 대해 접미사를 붙여 저장되게 한다.
- input-file 의 name이 1개뿐이라면 name이 키가 되고, 2개이상일 경우 name, name_1, name_2, ... 이 되게한다.
- 물론 여전히 메서드를 추가해야하지만 2번의 경우보다 그 범위가 훨씬 작다.
4. 필요에 따라 리졸버를 다르게 혹은 CommonFileUpload 를 직접 사용한다.
- 차라리 2번의 방법을 통해 소스코드 전체를 수정해서 일관성을 갖게하지 설정 또는 aop를 통해 일부 모듈만 예외를 두는건 바람직하지 않다.
현재는 3번의 방법으로 처리하려 합니다.
제가 지식이 부족해 어떤 방법이 좋을지도, 좋은 해결책도 못찾고 있습니다.
해서 다른 대안책을 듣고 싶습니다.
이상입니다. 감사합니다.
A
안녕하세요. 김예솔님..
지적하신 것 처럼.. EgovMultipartResolver의 경우는 name(FieldName)을 키로 해서 Map에 보관 처리하기 때문에.. 동일한 처리가 불가능합니다..
그래서 공통컴포넌트에서는 "CommonsMultipartResolver"를 사용하고 있습니다. (context-common.xml 참조)
그리고.. 아래 시도하신 방법은 어떤 것을 사용하셔도 무방합니다.
참고로 현재 공통컴포넌트의 egovframework.com.cmm.service.EgovFileMngUtil.java 등을 확인하시면 되실 것 같습니다.
그럼.. 즐거운 하루되십시오.
감사합니다.
지적하신 것 처럼.. EgovMultipartResolver의 경우는 name(FieldName)을 키로 해서 Map에 보관 처리하기 때문에.. 동일한 처리가 불가능합니다..
그래서 공통컴포넌트에서는 "CommonsMultipartResolver"를 사용하고 있습니다. (context-common.xml 참조)
그리고.. 아래 시도하신 방법은 어떤 것을 사용하셔도 무방합니다.
참고로 현재 공통컴포넌트의 egovframework.com.cmm.service.EgovFileMngUtil.java 등을 확인하시면 되실 것 같습니다.
그럼.. 즐거운 하루되십시오.
감사합니다.