JAKARTAPROJECT
JAKARTA TIPJSP TIPJSP 질문&답변DATABASE TIPJAVASCRIPT TIPWEBHACKING TIP기타 TIP
자카르타 프로젝트
자카르타 프로젝트
자카르타 프로젝트 팁 게시판 입니다
Commons-net I탄 FTP
GoodBug
이미지 슬라이더 보기

Commons net

 

I. Commons net

Jakarta Commons의 net은 network utility collection입니다.

인터넷 프로토콜을 대부분지원하는 강력한 유틸리티로 사용이 쉽고 간결합니다.

 

클라이언트측의 기본적인 Internet protocol을 구현함으로서 고차원적인 abstract가 아닌 기본적인 프로토콜 access가 목적이기 때문에 부분적으로 object-orient 규칙에 위배되는 사항이 있다는것을 참고적으로 알자

 

Commons net이 지원하는 프로토콜은 다음과 같다

  • FTP
  • NNTP
  • SMTP
  • POP3
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP

FTP의 경우 이전에는 sun 패키지의 FtpClient를 사용했지만 이제는 Commons net의 FTP를 사용해 봅시다

 

II. 준비물~

Commons net은 자체적으로 ORO를 사용합니다

Jakarta ORO란 파일이름의 치환, 분할, 필터링 등을 수행하기 위한 Perl5 호환 정규식, AWK와 같은 정규식, glob 표현, 그리고 유틸리티 클래스들을 제공하는 텍스트 처리 자바 클래스들입니다

 

Commons net http://jakarta.apache.org/site/downloads/downloads_commons-net.cgi

Jakarta ORO http://jakarta.apache.org/site/downloads/downloads_oro.cgi

 

참고자료

Commons net API http://jakarta.apache.org/commons/net/apidocs/index.html

Commons net http://jakarta.apache.org/commons/net/

 

III. org.apache.commons.net.ftp 의 흐름

sun 패키지의 FTPClient처럼 FTP여러 동작을 Commons net의 FTPClient로 구현해 보자

 

다음 ① ~ ⑦까지 목록은 필수항목으로 구현되어야 합니다.

논리적으로 보면 간단합니다

FTPClient 생성

먼저 가장 중심적인 역할을 하는 FTPClient를 생성합니다

FTPClient ftpClient = new FTPClient();

 

FTPServer에 Connect

서버에 연결을 합니다

ftpClient.connect(server);

 

응답이 정상적인지 확인 합니다

응답을 받아와서

int reply = ftpClient.getReplyCode();

 

정상적인지 확인해 봅니다
if (!FTPReply.isPositiveCompletion(reply)) {

    정상적이지 않으면 연결을 끊고 종료 합니다

    ftpClient.disconnect();


    System.out.println("FTP server refused connection.");

}  else {

    정상적이면 계속 진행 합니다
    System.out.println("Connect successful");

    ..

}

 

FTP Server 로그인

ftpClient.login(username, password);

 

여러가지 작업을 합니다

list, get, put...

 

FTP Server 로그아웃

ftpClient.logout();

 

FTP Server disconnect

ftpClient.disconnect();

 

IV. 사용예제 - 목록보기

본격적으로 FTP에 접속하여 목록을 가져오는 소스를 봅시다

FTPClient ftpClient = null;

try {

    ftpClient = new FTPClient();

    ftpClient.setControlEncoding("euc-kr");  // 한글파일명 때문에 디폴트 인코딩을 euc-kr로 합니다

    ftpClient.connect("user.chollian.net");  // 천리안 FTP에 접속합니다

 

   int reply = ftpClient.getReplyCode(); // 응답코드가 비정상이면 종료합니다
   if (!FTPReply.isPositiveCompletion(reply)) {
       ftpClient.disconnect();
       System.out.println("FTP server refused connection.");    

   } else {


       System.out.print(ftpClient.getReplyString());  // 응답 메세지를 찍어봅시다

 

       ftpClient.setSoTimeout(10000);  // 현재 커넥션 timeout을 millisecond 값으로 입력합니다
       ftpClient.login(username, password); // 로그인 유저명과 비밀번호를 입력 합니다

       // 목록보기 구현

       FTPFile[] ftpfiles = ftpClient.listFiles("/public");  // public 폴더의 모든 파일을 list 합니다
       if (ftpfiles != null) {
           for (int i = 0; i < ftpfiles.length; i++) {
               FTPFile file = ftpfiles[i];
               System.out.println(file.toString());  // file.getName(), file.getSize() 등등..

           }
       }

       ftpClient.logout();
   }

} catch (Exception e) {
   System.out.println(e);
   e.printStackTrace(); 
} finally {
   if (ftpClient != null && ftpClient.isConnected()) {
    try {
         ftpClient.disconnect();
    } catch (IOException ioe) {
         ioe.printStackTrace();
    }
}

 

목록보기 방법에는 한가지 방법이 더 있습니다

위의 코드는 해당 디렉토리내의 모든 파일을 가져오는 방법이며 다음 방법은 해당 디렉토리의 모든 파일을 정해진 수로 짤라 가져오는 방법이 있습니다.

위의 빨간색 코드대신 다음 코드가 들어갈 수 있습니다.

 

    int page = 1;
    FTPListParseEngine engine = ftpClient.initiateListParsing("/public"); // 목록을 나타낼 디렉토리
    while (engine.hasNext()) {
        FTPFile[] ftpfiles = engine.getNext(10); // 10개 단위로 끊어서 가져온다


        System.out.println("------------------------ "+page+" ------------------------");    

        if (ftpfiles != null) {
            for (int i = 0; i < ftpfiles.length; i++) {
                 FTPFile file = ftpfiles[i];
                 System.out.println(file.toString());
           }
        }
        System.out.println("------------------------ "+(page++)+" -------------------------");
    }

 

V. 사용예제 - get (파일 다운로드)

서버의 /public/테스트.txt 파일을 클라이언트의 C:\\Test\\테스트.txt 에 다운받는 예제

    File get_file = new File("C:\\Test\\테스트.txt");  
    OutputStream outputStream = new FileOutputStream(get_file);
    boolean result = ftpClient.retrieveFile("/public/테스트.txt", outputStream); 

    outputStream.close();

 

VI. 사용예제 - put(파일 업로드)

클라이언트의 C:\\Test\\보내자.txt 파일을 서버의 /public/보내자.txt 에 업로드하는 예제

만일 서버에 이미 /public/보내자.txt 파일이 있다면 덮어쓰게 된다

    File put_file = new File("C:\\Test\\보내자.txt");
    inputStream = new FileInputStream(put_file);
    boolean result = ftpClient.storeFile("/public/보내자.txt", inputStream);
    inputStream.close();

 

VII. 사용예제 - append (파일업로드)

위의 예제와 같은 기능을 하지만 이미 파일에 동일한 파일이 있으면 false를 반환하면서 실행하지 않는다

    File append_file = new File("C:\\Test\\더해라.txt");
    inputStream = new FileInputStream(append_file);
    boolean result = ftpClient.appendFile("/public/더해라.txt", inputStream);
    inputStream.close();

 

VIII. 사용예제 - rename (파일 이름변경)

변경전 파일명과 변경할 파일명을 파라미터로 준다

     boolean result = ftpClient.rename("/public/바꾸기전파일.txt", "/public/바꾼후파일.txt");

 

IX. 사용예제 - delete (파일삭제)

삭제할 파일을 선택한다    

     boolean result = ftpClient.deleteFile("/public/test.txt");

 

X. 사용예제 - directory 생성

/public 에 oops 디렉토리를 생성한다

     boolean result = ftpClient.makeDirectory("/public/oops");

 

XI. 사용예제 - OS 커맨드 입력하기

/public 에 oops 디렉토리를 생성한다

ftpClient.sendCommand(FTPCommand.MAKE_DIRECTORY, "/public/oops");

 

sendCommand 함수에 FTPCommand의 실행할 OS명령을 static 멤버변수를 넘겨준다

 

XII. 사용예제 - 작업디렉토리 설정하기

작업디렉토리를 /public 설정한 후 oops 디렉토리를 설정한다 (위의 예제와 비교해보라!)

ftpClient.changeWorkingDirectory("/public");

boolean result = ftpClient.makeDirectory("oops"); // /public/oops 절대경로를 적지 않아도 된다

 

XIII. 사용예제 - 파일 및 전송형태 설정

파일 형태 설정

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

파일 타입

FTP.BINARY_FILE_TYPE, FTP.ASCII_FILE_TYPE, FTP.EBCDIC_FILE_TYPE, FTP.IMAGE_FILE_TYPE , FTP.LOCAL_FILE_TYPE

이 값을 설정하지 않으면 디폴트는 ASCII 이다

 

전송 형태 설정

ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);

전송 타입

FTP.BLOCK_TRANSFER_MODE, FTP.COMPRESSED_TRANSFER_MODE  

이값을 설정하지 않으면 디폴트는 FTP.STREAM_TRANSFER_MODE 이다

 

 

XIV. FTP접속시 글목록이 보이지 않는경우 아래 URL을 참고하세요

 

Jakarta Commons Net 에서 FTP 사용시 목록이 안보일 경우

http://www.jakartaproject.com/article/jakarta/1132032615162

 

목록이 안보일 경우 해결기 I탄

http://www.jakartaproject.com/article/jakarta/1135307924491

 

테스트한 파일을 첨부합니다 ^^

 

=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

 

 

2009-12-20 08:48:48
211.189.124.***

 

좋은생각 ^^

첨부파일 (총 1개)
  1. NetFTP.java 4.69 KB (1,416 다운로드)
6점 (3명)
덧글 11개 | 태그 2개 | 관련글보기
태그입력
쉽표(,)구분으로 한번에 여러 태그를 입력할수 있습니다
FTP (7) commons (16)
헬프미
(0) (0)
---------- 자바컴파일 ---------- ftp_client.java:5: cannot access org.apache.commons.net.ftp.FTPClient bad class file: C:\jdk1.3.1_15\jre\lib\ext\commons-net-1.4.0.jar(org/apache/commons/net/ftp/FTPClient.class) class file has wrong version 48.0, should be 47.0 Please remove or make sure it appears in the correct subdirectory of the classpath. FTPClient ftpClient = null; ^ 이런 메시지 뜨면 어케 해야 되요 ?
203.236.3.*** 2005-08-24 11:40:06
GoodBug
(0) (0)
이 에러는 tools.jar와 실제 사용하는 JVM의 버전이 다르기 때문입니다. java -version 해서 Java의 버전을 확인하고, 실제 복사한 tools.jar가 그 버전 과 동일한 JDK에서 복사되었는지 확인하시기 바랍니다. 혹은 다시 JDK를 설치해 보세요
211.189.124.*** 2005-08-24 15:55:07
부평초
(0) (0)
해당 디렉토리의 모든 파일을 정해진 수로 짤라 가져오는 방법중에서while(engine.hasNext()) <----부분에서 그냥 빠져나가 버리느데요 어떻게 하면 될까요??? 제가 쓰고 있는 서버는 unix고요 jdk1.4.2에 commons-net-1.4.0을 이용하고 있읍니다...조언 부탁드립니다...
147.6.34.*** 2005-10-04 21:00:16
jinu
(0) (0)
위의 소스를 테스트해본 결과 업로드,다운로드등 기능은 잘돌아가는데마지막에 다음과 같은 에러가 뜹니다. 해결방법이 있는지요? ava.net.SocketException: Connection reset java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at java.io.BufferedInputStream.read1(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) at java.io.BufferedInputStream.fill(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) at org.apache.commons.net.telnet.TelnetInputStream.__read(TelnetInputStream.java:114) at org.apache.commons.net.telnet.TelnetInputStream.run(TelnetInputStream.java:535) at java.lang.Thread.run(Unknown Source)
221.145.178.*** 2005-12-09 18:46:00
나그네
(0) (0)
ftpClient.setSoTimeout(10000); 요부분의 시간을 적당히 고치거나 막으시면 될듯합니다.
203.227.167.*** 2005-12-22 15:22:38
나그네
(0) (0)
좋은글 감사합니다. 그런데 파일 리스트를 가져오는 예제를 테스트 해보니까 알FTP서버에서 하면 잘가져 오는데 UNIX ftp서버에서 테스트 해보면 두가지 방법 모두 파일리스트를 가져오지 못합니다.(에러가나는것은 아니고 ftpfiles.length가 0 입니다.) 뭐가 잘못된건가요?
203.227.167.*** 2005-12-22 15:31:31
jolaking
(0) (0)
FTP 서버별 지원가능 명령어 제약이 있기 때문에 그런것 같습니다. 예를 들어 어떤 FTP 서버는 DIR을 지원하지만 어떤건 LS를 지원하듯이 마리죠
211.221.155.*** 2006-01-17 10:24:03
ganchiz
(0) (0)
java.net.SocketException: Connection reset java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at java.io.BufferedInputStream.read1(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) at java.io.BufferedInputStream.fill(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) at org.apache.commons.net.telnet.TelnetInputStream.__read(TelnetInputStream.java:114) at org.apache.commons.net.telnet.TelnetInputStream.run(TelnetInputStream.java:535) at java.lang.Thread.run(Unknown Source) 저도 이런 에러가 나는데 확인해 보니. ftpClient.setSoTimeout(10000); 소켓 타임아웃 시간설정과는 상관없는 것 같구요 ftpClient.logout(); 이부분에서 에러가 나는 군요.. 확인해 보고 해결되면 다시 코멘트 달겠습니다.
203.248.234.*** 2006-02-09 13:13:25
GoodBug
(0) (0)
네트웍이 강제로 끊어지는 현상같은데.. 좀더 찾아봐야 겠네요
211.189.124.*** 2006-02-10 08:50:14
티케이오
(0) (0)

 at org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory.createUnixFTPEntryParser(DefaultFTPFileEntryParserFactory.java:169)
 at org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory.createFileEntryParser(DefaultFTPFileEntryParserFactory.java:94)
 at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2358)
 at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2141)
 at FTPTest.inner(FTPTest.java:43)
 at FTPTest.<init>(FTPTest.java:11)
 at FTPTest.main(FTPTest.java:72)

어떤 에러인지 잘 모르겠는데요, 가르침 부탁 드립니다.알려주십시오~ ㅠ

203.247.248.*** 2007-03-14 04:51:30
갸겨교
(0) (0)

다운로드 예제에서

 

====================================================================

File get_file = new File("C:\\Test\\테스트.txt");  
    OutputStream outputStream = new FileOutputStream(get_file);
    boolean result = ftpClient.retrieveFile("/public/테스트.txt", outputStream); 

    outputStream.close();

====================================================================

 

ftpClient.retrieveFile 메서드에서 첫번째 인자는 다운로드할 파일이 있는 경로를 뜻하는 것인줄 알겠는데, 두번째 인자인 outputStream에서 받아들이는 File 객체의 경로를 지정할 때 다운로드할 장소를 지정하는 거 같은데 그게 맞는지요?

 

설명을 보면 마치 테스트.txt라는 파일이 실제로 로컬 C\test\에 존재한 상태에서 새로이 다운로드할 파일을 테스트.txt로 한다는 느낌이 드네요.

 

저같은 경우 위와 같이 했을 때 다운로드가 되는 것처럼 보이기는 하는데 실제로 다운로드된 파일의 크기가 0바이트입니다.

 

203.247.149.*** 2007-12-26 13:48:07
이름 비밀번호
자카르타 프로젝트
자카르타 프로젝트 팁 게시판 입니다
! 번호 제목 글쓴이 일자 조회
Hierarchy of the Apache Software Foundation GoodBug 2005-10-14 10,741
Jakarta Project 강좌 게시판입니다 8 GoodBug 2005-04-03 11,614
44 Log4J log4j에서 e.printStackTrace() 메시지를 log에 남기는 방법 1 kaiser 2008-10-22 17,547
43 DBUtils DBUtils에서 Clob 사용하기 3 1 GoodBug 2007-08-28 10,569
42 Spring Spring 설정 파일 로딩 1 GoodBug 2007-07-16 11,253
41 POI POI의 HSLF를 이용하여 PowerPoint 문서를 읽어보자 2 GoodBug 2007-05-28 14,837
40 POI POI의 HWPF를 이용하여 MS WORD문서를 읽어보자 2 GoodBug 2007-05-28 16,758
39 Validator Validator 속성들 1 GoodBug 2007-05-11 10,329
38 dd Commons-Fileupload 1.2 1 2 GoodBug 2007-04-23 15,267
37 Apache Apache2 + Tomcat5.5 + mod_jk 4 바이러스天国 2007-01-29 10,970
36 DBUtils DBUtils에서 number 타입의 컬럼이 int형으로 안넘어올때.. 3 1 GoodBug 2006-06-28 10,679
35 흠흠 위험한 static Logger 필드... 2 1 서연아빠 2006-03-16 10,051
34 Installing Tomcat with commons-daemon (jsvc) GoodBug 2006-01-08 9,005
33 commons Commons DbUtils 몇가지 예제 3 2 GoodBug 2005-11-17 15,124
32 commons Jakarta Commons Net 에서 FTP 사용시 목록이 안보일 경우 2 GoodBug 2005-11-15 21,699
31 listFiles() 에서 null 을 반환 추적.. 신만두 2008-11-11 11,770
30 commons 목록이 안보일 경우 해결기 I탄 1 2 GoodBug 2005-12-23 15,859
29 POI POI로 엑셀파일 읽을때, Invalid header signature 에러 1 GoodBug 2005-11-12 16,468
28 log4j log4j, JSP에서 원하는 Appender 골라쓰기 1 GoodBug 2005-11-07 13,825
27 commons Commons-Email~ 7 2 GoodBug 2005-10-13 17,787
copyright 2005-2017 by Unicorn