스윙으로 만든 파일 업로드 애플릿
스윙을 사용한 파일 업로드용 Signed Applet입니다.
많이들 테스트 해보시고 도움을 주셨으면 합니다.
특히나 현재 파일 전송 속도하고 전송량을 표시하는
프로그레스바가 동기화가 되질 않습니다. 이부분에 대해
한 수 가르쳐 주시면 고맙겠습니다...^^
다음은 압축파일 속에 있는 readme 파일의 내용입니다.
////////////////////////////////////////////////////////////////////////
//
// SwingUploaderUI 설명서
//
// 작성자 : 우형준
// 연락처 : woohj70@hanmail.net
// URL : http://www.javaden.co.kr
// http://www.mazdah.com
//
////////////////////////////////////////////////////////////////////////
1. 개요
안녕하십니까 Mazdah(우형준)이라고 합니다.
이번에 약간의 짬을 내서 파일 업로드 애플릿을 하나 만들어봤습니다.
클라이언트 측의 파일을 건드려야 하므로 당연히 Signed Applet으로 작성이
되었고, UI는 무리수를 좀 두어서 Swing으로 제작을 하였습니다.
전체적인 구성은 크게 4부분으로 나눌수 있습니다.
1. Swing GUI부분
2. HTTP Request 작성 및 전송부분 (http://www.javasun.net의 으샤님 소스 수정)
3. 서버측 요청 수신부 (com.oreilly.servlet 패키지중 MultiPartParser 클래스만 사용)
4. 전송 상태 표시 프로그레스 바 프레임
1과 2가 하나의 파일에 묶여있고
3과 4가 각각 하나의 파일로 되어 소스 파일은 총 3개가 있습니다.
전체적인 작업은 윈 XP에서 Oracle JDeveloper 9.0.3.1(Build 1107)과 에디트 플러스로
진행을 하였습니다.
2. 설치 및 사용
일반 애플릿과 같은 방식으로 사용을 하시면 됩니다.
SwingUploderUI.java파일로 부터 생성된 클래스들과 ProgressFrame.class는 SwingUploader.jar
로 묶인 후 SSwingUploader.jar로 인증된 .jar 파일로 만들어져 있습니다. 이것이 애플릿으로
사용되는 아카이브이며 현재 테스트 페이지인 swuploader.html과 같은 디렉토리에서 사용되도록
설정되어 있습니다.
MultiPartParser.class는 기존에 사용하시던 대로 소스에서 패키지 선언부분을 적절히 수정하신 후
컴파일하고 .jsp 파일에서 임포트 시키거나 bean으로 선언하여 사용하시면 됩니다.
클라이언트 위치에서 데이터의 전송이 일반적인 form 태그의 submit을 통해 이루어지지가 않습니다.
데이터 전송은 swuploader.html의 상단에 코딩된 자바 스크립트와 같은 형태로 애플릿의
Applet.setParameter(String Parameter_Name, String Parameter_value); 함수를 호출한 후
Applet.sendHTTPStream();을 호출함으로써 전송되게 되며, 파일은 애플릿에서 선택만 해주시면되고
다른 작업은 필요없이 Applet.sendHTTPStream();이 호출되는 순간 애플릿에서 선택된 파일들이
같이 전송되게 됩니다.
서버측에서는 일반적으로 Form 데이터를 받는 것과 같은 방식으로 MultiPartParser객체를 생성하여
getParameter(String Parameter_value) 함수를 호출하여 받으면 됩니다.
파일 데이터를 수신하는 부분은 다음과 같이 합니다.
//이 때의 MultiPartParser의 두 인자는 request객체와 업로드된 파일이 저장될 디렉토리입니다.
MultiPartParser mp = new MultiPartParser(request, "/web/woohj70/www.javaden.co.kr/test/upload");
String[] files = mp.getParameterArr("f1");
여기서 파라미터이름인 f1은 파일을 전송받기 위한 이름으로 고정되어있으며 수정을 하시고자 할 경우
ProgressFrame.java파일의 run() 메서드 안에서 수정하셔야 합니다.
mp.getParameterArr("f1"); 함수는 같은 이름에 여러개의 값을 가지고 있는 폼 데이터를 String 배열로
받아오기 위해 제가 삽입한 함수로 사실 제가 사용한 MultiPartParser 버전이 언제 것인지는 잘 모르지만
어느 정도 오래된 것이라 혹시 최신 버전에는 같은 용도를 위한 메서드가 준비 되어있는지도 모르겠습니다.
3. 라이센스
1에서 말씀드린바와 같이 제가 혼자서 만들었다고 보기는 좀 어렵습니다.
특히나 MultiPartParser 같은 경우 다만 함수 하나만을 삽입한 정도일 뿐 다른 부분들은
그대로 사용하고 있으며 정도의 차이는 있지만 으샤님의 소스도 역시 마찬가지입니다.
따라서 제가 라이센스 권한을 결정을 하고 싶어도 양해를 구하지 않고 가져다가 사용한
부분이 많은 만큼 딱히 라이센스에 대해서는 언급을 하지 않겠습니다.
재배포를 하실 경우에는 이점을 유의하시기 바랍니다.
4. 현재까지 발견한 문제점들
일단 Swing의 FileChooser에 약간의 문제가 있습니다.
얼마전 다른 어플리케이션을 만들었을 경우도 같은 문제가 있었는데 FileChooser를 띄우는
버튼을 클릭하였을 경우 FileChooser가 뜨지 않고 프로그램(브라우저)가 종료되는 현상이
종종 있습니다. 이것이 FileChooser의 버그인지 아니면 윈도우와의 호환성 문제인지는
잘 모르겠지만 혹시 이에 대한 해결책을 알고 계신분은 한 수 지도를 해주시면 고맙겠습니다.
현재 파일 전송 상태를 보여줄 프로그레스바를 구현하였는데 안타깝게도 실제 전송 속도와
동기화가 되지 않고 있습니다. 현재로서는 프로그레스 바가 다 지나가고 나서 한참이
지나야 파일 업로드가 종료되는데 이에 대해서도 역시 한 수 지도를 기다리고 있겠습니다.
기타 스윙으로 제작함으로 인해 처음 실행시 몇분 가량의 시간을 투자해 JRE 플러그인을
다운받게 됩니다. 또한 제가 작성한 정체불명(-_-;;;)의 인증서 확인 창이 뜨게 될 것입니다.
이러한 불편함은 어쩔 수 없이 감수하셔야 할 것입니다.
5. 몇가지 장점
-.가장 기본적으로 손쉬운 다중 업로드를 들 수 있습니다.
파일 다이얼로그(FileChooser)를 통해 파일을 선택하기만 하면 되며 폴더(디렉토리)단위로
선택할 수도 있습니다.
-. 일단 애플릿으로 제작됨으로 해서 기존의 공개 업로드 프로그램들에서는 구현이 어려웠던
클라이언트단에서 파일 크기를 체크하여 전송을 제한하는 등의 작업이 가능합니다.
제한 크기나 제한 파일 수는 애플릿이 삽입된 html(혹은 jsp)파일에서 PARAM 태그로 넘겨주시면
됩니다.
-. 현재는 프로토타입이라 디자인이 구리지만...-.- 차후에 미려한 디자인을 적용하실 수 있습니다.
-. submit 기능을 하는 버튼을 누르기 전까지는 절대 파일이 서버로 올라가지 않습니다.
따라서 게시물 작성 도중 브라우저를 빠져나갔을 경우의 처리가 필요없습니다.
6. 테스트 페이지
http://www.javaden.co.kr/applet/부탁드리건데 요상한 것 올리지 말아주세요...^^;;;
현재 설정은 파일 한 개당 10M
총 업로드 가능 파일 갯수 10개
업로드할 파일 총 용량 100M
로 설정이 되어있습니다.
7. Contact
이름 : 우형준
Nick : Mazdah
소속 : NewIT
e-mail : woohj70@hanmail.net
URL : http://www.javaden.co.kr
http://www.mazdah.com