사랑합니다. 편안히 잠드소서

[JAVA] apache.commons.net 을 이용한 FTP Client

조회 수 23703 추천 수 0 2009.03.17 14:15:13
sun에서 기본 제공하는 ftp client api보다 쓰기가 훨씬 수월하다.

일단 사용을 위해서는 Apache에서 진행중인 Jakarta 프로젝트 사이트로 가서

Jakarta ORO(정규식 Class의 모음정도 라고 생각하면 될것이다.)와 Jakarta Commons Net 이 필요하다.

해당 JAVA Library에 대해서는 링크를 통해 들어가 확인하면 될것이고 Apache Commons Net은 다음과 같은

프로토콜을 지원한다.

Supported protocols are:

  • FTP/FTPS
  • NNTP
  • SMTP
  • POP3
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP
이중 첫번째 FTP/FTPS를 이용해서 FTP Client의 Data Up/Download 셈플과 몇가지 FTP 명령어를 다루려 한다.

Apache Commons Net을 이용한 FTP Client 셈플 소스 및 기타 셈플들은 API문서에 잘 기록되어 있으니 참고바란다.

일단 API 문서에서 제공하는 소스 말고 그냥 아주 간단히 파일 업로드 프로그램을 구현해보자.

(코딩 스타일이 JAVA 표준 스타일이 아니다. ^^;... 보기가 난잡하더라도 이해를 해주시라~)
FTP Client. Upload Example
FTPClient        ftp        = null;        // FTP Client 객체
FileInputStream   fis        = null;        // File Input Stream
File        uploadfile    = new File("File Name");        // File 객체

try
{
        
    ftp    = new FTPClient();        // FTP Client 객체 생성
    ftp.setControlEncoding("UTF-8");        // 문자 코드를 UTF-8로 인코딩
    ftp.connect("localhost");      // 서버접속 " "안에 서버 주소 입력 또는 "서버주소", 포트번호
    ftp.login("test", "test");        // FTP 로그인 ID, PASSWORLD 입력
    ftp.enterLocalPassiveMode();        // Passive Mode 접속일때 
    ftp.changeWorkingDirectory("/");        // 작업 디렉토리 변경
    ftp.setFileType(FTP.BINARY_FILE_TYPE);        // 업로드 파일 타입 셋팅
    
    try
    {
        fis    = new FileInputStream(uploadfile);        // 업로드할 File 생성
        ftp.storeFile(uploadfile.getName(), fis);        // File 업로드
    }
    catch(IOException ex)
    {
        System.out.println("IO Exception : " + ex.getMessage());
    } 
    finally 
    {
        if (fis != null)
        {
            try
            {
                fis.close();        // Stream 닫기
            }
            catch(IOException ex)
            {
                System.out.println("IO Exception : " + ex.getMessage());
            }
        }
    }
    ftp.logout();    // FTP Log Out
}
catch(IOException e) 
{
    System.out.println("IO:"+e.getMessage());
}
finally 
{
    if (ftp != null && ftp.isConnected()) 
    {
        try 
        {
            ftp.disconnect();        // 접속 끊기
        }
        catch (IOException e)
        {
            System.out.println("IO Exception : " + e.getMessage());
        }
    }
}

// ㅡㅡ; 주석 줄 안맞아서 정말 짜증난다.

위 코드에서 보면 알겠지만 정말 간단하다.

업로드는 19번째 줄의 ftp.storeFile("File Name", FileInputStream) 을 이용하여 할 수 있고 반환값은 boolean이며

업로드에 성공하면 true 실패하면 false를 반환한다. 위 코드에 간단하게 if문을 추가 하면 업로드 실패시

재시도 같은 코드를 넣을 수 있다.

FTP Client. Upload Example.
boolean bSuccess = ftp.storeFile(uploadfile.getName(), fis);    // File 업로드
if (bSuccess)
{
    // 성공 했을때 할 작업
}
else
{
    // 실패 했을때 할 작업
}

그럼 다운로드는 어떻게 해야 할까? 코드를 살살 본 사람들은 대충 눈치를 챘을 것이다.

별것 없이 FileOutputStream을 이용해서 받아와서 저장하면 그만인것이다. 코드는 다음과 같다.

FTP Client. Download Example
FTPClient        ftp        = null;        // FTP Client 객체
FileOutputStream   fos        = null;        // File Output Stream
File        downloadfile    = new File("File Name");        // File 객체

try
{
        
    ftp    = new FTPClient();        // FTP Client 객체 생성
    ftp.setControlEncoding("UTF-8");        // 문자 코드를 UTF-8로 인코딩
    ftp.connect("localhost");      // 서버접속 " "안에 서버 주소 입력 또는 "서버주소", 포트번호
    ftp.login("test", "test");        // FTP 로그인 ID, PASSWORLD 입력
    ftp.enterLocalPassiveMode();        // Passive Mode 접속일때 
    ftp.changeWorkingDirectory("/");        // 작업 디렉토리 변경
    ftp.setFileType(FTP.BINARY_FILE_TYPE);        // 다운로드 파일 타입 셋팅
    
    try
    {
        fos    = new FileOutputStream(downloadfile);        // 다운로드할 File 생성
        ftp.retrieveFile(downloadfile.getName(), fos);
    }
    catch(IOException ex)
    {
        System.out.println("IO Exception : " + ex.getMessage());
    } 
    finally 
    {
        if (fos != null)
        {
            try
            {
                fos.close();        // Stream 닫기
            }
            catch(IOException ex)
            {
                System.out.println("IO Exception : " + ex.getMessage());
            }
        }
    }
    ftp.logout();    // FTP Log Out
}
catch(IOException e) 
{
    System.out.println("IO:"+e.getMessage());
}
finally 
{
    if (ftp != null && ftp.isConnected()) 
    {
        try 
        {
            ftp.disconnect();        // 접속 끊기
        }
        catch (IOException e)
        {
            System.out.println("IO Exception : " + e.getMessage());
        }
    }
}

보는 바와 같이 똑같은 코드에 단순히 19번째 줄에 strFile 대신 retrieveFile 이란 메소드를 이용하면 끝이다.

그밖에

File 삭제 : ftp.deleteFile("File Name");

File 이름 변경 : ftp.reanme("기존이름", "변경할이름");

명령어 전송 : ftp.sendCommand(ftp.FTPCommand 상수);

리스트 받아오기등 많은 것을 편하게 할 수 있다.

그리고 해당 예제도 API 문서에 보면 친절하게 나와있으니 참고하길 바란다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
30 [JAVA] JTable 내용 수정 이벤트 관련. [397] [레벨:30]id: 그녀의남자그녀의남자 2012-05-22 20305
29 [MFC] HTTP 이어받기 [1164] [레벨:30]id: 그녀의남자그녀의남자 2011-05-12 65116
28 [Android] Custom ListView Sample [1] [1778] [레벨:30]id: 그녀의남자그녀의남자 2010-07-16 94260
27 [Flex] 해상도 구하기등... [79] [레벨:30]id: 그녀의남자그녀의남자 2009-10-22 12147
26 [JAVA] String to byte[] [413] [레벨:30]id: 그녀의남자그녀의남자 2009-10-20 48092
25 [Flex] Base64 인코딩, Base64 디코딩 [474] [레벨:30]id: 그녀의남자그녀의남자 2009-08-28 38566
24 [JAVA] Zip 파일 압축 소스 [레벨:30]id: 그녀의남자그녀의남자 2009-06-27 20037
23 [Flex] Google Weather API 이용하기. file [레벨:30]id: 그녀의남자그녀의남자 2009-05-20 30176
22 [Flex] Yahoo에서 날씨가져오기. file [레벨:30]id: 그녀의남자그녀의남자 2009-04-20 16413
21 [VC++] MFC Dialog Control 색 변경 [레벨:30]id: 그녀의남자그녀의남자 2009-03-30 19569
20 [VC++] 화면캡쳐 소스 [1] [레벨:4]촬쓰 2009-03-25 16166
19 [JAVA] 자바 스크린 캡춰 소스 - 아래꺼 수정 - [레벨:30]id: 그녀의남자그녀의남자 2009-03-24 54665
» [JAVA] apache.commons.net 을 이용한 FTP Client [레벨:30]id: 그녀의남자그녀의남자 2009-03-17 23703
17 [JAVA] HashMap 사용예. [1] [레벨:30]id: 그녀의남자그녀의남자 2009-03-10 28823
16 [FLEX] Flex Timer [레벨:30]id: 그녀의남자그녀의남자 2009-03-05 13005
15 [JAVA] DB Connection 카운터. [레벨:30]id: 그녀의남자그녀의남자 2009-03-04 12616
14 [JAVA] 화면 캡춰 소스 [레벨:30]id: 그녀의남자그녀의남자 2008-07-08 13135
13 [VC++] 네트워크 스캔 file [레벨:30]id: 그녀의남자그녀의남자 2008-07-08 12442
12 [VC++] 10초만에 만드는 Flash Player file [1] [레벨:30]id: 그녀의남자그녀의남자 2008-07-08 15942
11 [JAVA] DES 파일 암복호화 소스 [레벨:30]id: 그녀의남자그녀의남자 2008-07-08 23846


미디어협동조합 국민TV