본문 바로가기

Programming/JAVA

자바<JAVA> 아파치(APACHE) 오픈소스 COMMONS NET 이용하여 FTP파일업로드 하기


출처 : http://blog.naver.com/lover4908?Redirect=Log&logNo=110072552163


필요한 라이브러리

jakarta-oro-2.0.8.jar

commons-daemon-1.0.5.jar


  1. import java.io.BufferedInputStream;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import org.apache.commons.net.ftp.FTP;
  5. import org.apache.commons.net.ftp.FTPClient;
  6. import org.apache.commons.net.ftp.FTPReply;
  7.  
  8. public class Util {
  9.  
  10.  public static final void simpleSendFileToFTP(String targetUrl , String id , String pwd , String port , String realSaveLocation , File file) throws Exception {
  11.  
  12.   FTPClient client = null;
  13.   BufferedInputStream bis = null;
  14.   try {
  15.    client = new FTPClient();
  16.    /*
  17.    FTPClientConfig config = new FTPClientConfig();  
  18.    config.setServerLanguageCode("ko");
  19.    config.setDefaultDateFormatStr("MM월 d일 HH:mm");
  20.    config.setRecentDateFormatStr("MM웡 d일 HH:mm");
  21.    client.configure(config);
  22.    */
  23.    client.setControlEncoding("euc-kr");
  24.    client.connect(targetUrl , Integer.parseInt(port));
  25.    int resultCode = client.getReplyCode();
  26.    
  27.    if(FTPReply.isPositiveCompletion(resultCode) == false){
  28.     throw new Exception("FTP 서버에 연결할 수 없습니다.");
  29.    }
  30.    else {
  31.     client.setSoTimeout(5000);
  32.     boolean isLogin = client.login(id, pwd);
  33.     if(isLogin == false) {
  34.      throw new Exception("FTP 서버에 로그인 할 수 없습니다.");
  35.     }
  36.     client.setFileType(FTP.BINARY_FILE_TYPE);
  37.    
  38.     String[] locArr = realSaveLocation.split("/");
  39.     String savaLoc = "";
  40.    
  41.     for(int i =0 ; i<locArr.length ; i++) {
  42.      savaLoc = savaLoc + locArr[i] + "/";
  43.      client.makeDirectory(savaLoc);
  44.     }
  45.    
  46.     bis = new BufferedInputStream(new FileInputStream(file));
  47.     boolean  isSuc = client.storeFile(savaLoc+file.getName(), bis);
  48.     //System.out.println("파일 전송 성공여부 : "+isSuc);
  49.     if(isSuc == false) {
  50.      throw new Exception("파일 업로드에 실패 하였습니다.");
  51.     }
  52.     /*
  53.     FTPFile[] list =  client.listFiles();
  54.     for(int i=0 ; i<list.length ; i++) {
  55.      try{
  56.      System.out.println(list[i].toString());
  57.      }catch (Exception e) {
  58.      }
  59.     }
  60.     */
  61.     client.logout();
  62.    }
  63.   } catch (Exception e) {
  64.    e.printStackTrace();
  65.    throw e;
  66.   }
  67.   finally {
  68.    
  69.    if(bis != null) {
  70.     try {bis.close()} catch (Exception e) { }
  71.    }
  72.    if(client != null && client.isConnected()) {
  73.     try { client.disconnect()} catch (Exception e) {}
  74.    }
  75.   }
  76.  
  77.  }
  78.  
  79. }
  80.  

 

simpleSendFileToFTP(String targetUrl , String id , String pwd , String port , String realSaveLocation , File file) 메소드 원형이 다음과 같습니다.

targetUrl  <-- FTP 주소

id  <-- 사용자 아이디

pwd <-- 사용자 패스워드

port  <-- FTP 포트입니다. 일반적으로 21을 사용할겁니다??

realSaveLocation  <-- FTP 서버에 저장되어야 할 경로입니다.

file <-- 업로드할 로컬파일의 경로입니다. 파일객체조

 

사용하실때는 예를 들어서

Util.simpleSendFileToFTP("127.0.0.1" , "User" , "Password" , "21" , "/doc/data/2009/10" , new File("c:/data/01/test.xls"))

이런식으로 사용하시면 됩니다.

 

혹시 실제 FTP의 저장될 경로의 폴더가 모두 존재하지 않을경우에 자동으로 생성하게 했습니다.

API중에 makeDirectory() 이녀석이 폴더를 생성하게 해주는데요. 상위폴더가 없으면 생성을 못하더군요. 그래서 문자열 / 을 구분자로 짤라서 상위부터 하나씩 생성하게 했습니다.

 

어렵고 복잡한게 싫어서 최대한 간단하게 개발하려고 해서 이런저런 설정하는 부분들은 다 빼버리고 했는데 , 저의 경우는 잘 동작하는군요.

 

혹시 FTP에 접속해서 파일 리스트를 받으려고 하시는 분중에 접속 및 로그인 다되는데 파일리스트만 가져오지를 못하는 경우가 있습니다.

이는 파일리스트 가져온 결과값에 한글이 포함되어 있으면  , 아파치 NET이 이 한글을 파싱하는 과정에서 오류가 발생해서 리스트를 가져오지 못합니다. 이 부분을 해결할려면 제가 주석으로 막아놓은 부분을 적용해보시기 바립니다. 
 /*
   FTPClientConfig config = new FTPClientConfig();  
   config.setServerLanguageCode("ko");
   config.setDefaultDateFormatStr("MM월 d일 HH:mm");
   config.setRecentDateFormatStr("MM웡 d일 HH:mm");
   client.configure(config);
   */
이 부분입니다.

 /*
    FTPFile[] list =  client.listFiles();
    for(int i=0 ; i<list.length ; i++) {
     try{
     System.out.println(list[i].toString());
     }catch (Exception e) {
     }
    }
    */
이 부분은 리스트 테스트 하는 부분이구요.

 

사실 위에 부분은 파일 업로드하는 것하고 밀접한 관계는 없으나 , 저처럼 접속잘되고 로그인 잘되고 업로드 다운로드 다 잘되는데 , 리스트를 가져오기 못하는 굉장히 당혹스러움을 경험해 무한삽질에 빠지는데 도움이 될까하여 남겼습니다.

 

파일 다운로드 처럼 , 위에것을 사용하려면 jar 파일 2개가 필요합니다. 업로드 할테니 다운받으세요.

최신것을 받으시려면 아파치 사이트 들어가서 받으셔요.

http://commons.apache.org/

여기로 들어가시면 됩니다.