2007년 10월 22일 월요일

Commons-upload 를 이용하여 파일 업로드를 구현해보자

Commons-upload를 이용하여 파일 업로드를 구현하였다.

Commons-upload 는 java용 파일 업로드 라이브러리이며 jakarta project의 sub project중의 하나이다.

실제 구현시 사용한 commons-upload jar파일 버젼은 1.2이다.

소스열기

그러면 아래에 윗 소스를 설명하면서 commons-upload에 대하여 알아보도록 하자.
파일을 업로드 하기 위하여서 Client Side에서 필히 POST방식으로 데이타를 Server Side에 전송하여야 한다. 우리는 Client에서 파일을 전송하는데 필요한 폼을 이미 구성하였다는 가정하여 Server Side소스만 살펴보자.
파일을 업로드 받는데 필수적 요소는 모두 3가지가 있다.

첫째, 파일소스 (즉 클라이언트에서 전송받은 파일이다.)
둘째, 파일을 저장 할 경로
셋째, 업로드 받을 파일의 최대 사이즈

위 세가지 요소를 제외하고도 사실 고려해야할 사항들이 많지만 여기서 우리는 위 요소들만 고려하여 실제 구현된 소스를 살펴보자.

1.2 이전 버젼을 사용하였다면 아마도 DiskFileUpload upload = new DiskFileUpload(); 이런 식으로 업로드 객체를 만들었었을것이다.
1.2 버젼을 업그레드 되면서 DiskFileUpload 클래스는 Deprecated되였으며 아마 1.3버젼부터는 삭제되여 질 수도 있다. Commons-upload API를 읽어보면 DiskFileUpload 대신 DiskFileItemFactory과 ServletFileUpload를 사용할것을 적극 권장하고 있었다.
자, 그럼 먼저 멀티파일을 업로드 받기 위하여 복수개 FileItem를 구성해야하는데 실제 우리는 request에서 넘어온 멀티 파일을 고려할 필요가 없이 아주 쉽게 이부분을 구현할 수 있다.
DiskFileItemFactory를 통하여 factory인스턴스를 만든다.

DiskFileItemFactory factory = new DiskFileItemFactory();

다음 factory 사이즈 계수를 설정해주어야 한다.

factory.setSizeThreshold(10485760);

여기서는 최대 10MB만 업로드 받을수 있게 숫치 10485760 을 입력한다.
다음 업로드 받을 파일의 경로를 적는다.

factory.setRepository( new java.io.File( currentDirPath ) );

currentDirPath는 사실 업로드될 파일의 경로이다.
만약 지정된 디렉토리가 만들어 지지 않았으면 아래에서 처럼 자동으로 생성해줄 수 도 있다.

File currentDir = new File(currentDirPath);
if ( !currentDir.exists() ) currentDir.mkdir();

factory에 대한 설정이 끝났으면 upload 객체를 만들어보자.

ServletFileUpload upload = new ServletFileUpload(factory);

위에서 만든 factory객체를 통함으로써 아주 쉽게 upload객체를 만들수가 있다.
다음 request를 통하여 넘어온 파일들을 파싱하여 생성된 실제 파일데이타들을 List에 쌓아둔다.
실제 여기서 미리 Generic을 이용하여 List에 저장된 데이타타입을 지정할수도 있지만 소스에서는 그렇게 구현을 하지 않았다.

List<?> items = upload.parseRequest(request);

또한 넘겨받은 필드가 폼필드인지를 검사하여 만약 폼필드인 경우에만 fields에 해당 값들을 쌓아두었다.

if (item.isFormField())
fields.put(item.getFieldName(),item.getString());
else
fields.put(item.getFieldName(),item);

댓글 없음:

댓글 쓰기