====== FTP 서비스 ======
===== 개요 =====
**전자정부 프레임워크**에서는 Jakarta Commons의 Net에서 지원하는 것은 Jakarta Commons의 Net[단순 클라이언트측의 기본적인 Internet Protocol의 구현의 FTP기능을 편리하게
제공]을 오픈 소스로 채택하였다.
Jakarta Commons의 Net은 network utility collection이다.
Jakarta Commons의 Net에서 지원하는 것은 단순 클라이언트측의 기본적인 Internet Protocol을 구현함으로서
고차원적인 abstract가 아닌 기본적인 프로토콜 access가 목적이기 때문에 부분적으로 object-orient 규칙에
위배가 되는 사항이 있다는 것을 참고적으로 알고 있어야 한다.
=== FTP정의 ===
FTP란 FTP (File Transfer Protocol) 파일 전송 프로토콜을 말함.
FTP[에프 티 피]는 인터넷상의 컴퓨터들 간에 파일을 교환하기 위한 표준 프로토콜로서 가장 간단한 방법이기도 하다.
화면에 표시할 수 있는 웹 페이지와 관련 파일들을 전송하는 HTTP, 전자우편을 전송하는 SMTP 등과 같이, FTP 역시 인터넷의 TCP/IP 응용 프로토콜 중의 하나이다.
FTP는 웹 페이지 파일들을 인터넷상에서 모든 사람이 볼 수 있도록 하기 위해 저작자의 컴퓨터로부터 서버로 옮기는 과정에서 사용된다.
또한, 다른 서버들로부터 자신의 컴퓨터로 프로그램이나 파일들을 다운로드 하는 데에도 많이 사용된다.
사용자 입장에서는 간단한 명령을 이용하여 FTP를 쓰거나, 또는 그래픽 사용자 인터페이스를 제공하는 상용 프로그램을 쓸 수도 있다.
보통은 웹 브라우저도 웹 페이지로부터 선택한 프로그램을 다운로드 하는데 FTP를 사용한다.
FTP를 사용하여 서버에 있는 파일을 지우거나 이름을 바꾸거나 옮기거나 복사하는 등 갱신작업을 할 수도 있다.
FTP 서버에는 로그온을 해야하지만, 익명의 FTP를 사용하여 모든 사람들에게 공개된 파일들을 쉽게 접근할 수 있도록 하고 있다.
FTP는 보통 TCP/IP에 함께 딸려오는 일련의 프로그램 속에 포함되어 있다.
===== 설명 =====
=== Jakarta Commons Net ===
Jakarta Commons Net 프로젝트(http://commons.apache.org/net/)에서 지원하는 프로토콜은 다음과 같다.
* FTP/FTPS
* NNTP
* SMTP
* POP3
* Telnet
* TFTP
* Finger
* Whois
* rexec/rcmd/rlogin
* Time (rdate) and Daytime
* Echo
* Discard
* NTP/SNTP
org.apache.commons.net.ftp의 흐름에 대하여 간략히 설명한다.
먼저 논리적 흐름도를 간략하게 구성하여 보았다.
1. FTP Client를 생성
2. FTP Server에 Connect 서버에 연결한다
3. 응답이 정상적인지 확인한다.
4. FTP Server 로그인한다
5. 접속하여 여러가지 작업(list, get, put....등등)
6. FTP Server 로그아웃한다
7. FTP Server disconnect
다음은 사용예제는 FTP에 접속하여 리스트를 볼수 있는 예제이다.
== 사용예제 ==
private static FileInputStream inputStream;
public static void main(String[] args) {
FTPClient client = null;
// 계정 로그인
try {
client = new FTPClient();
// 한글파일명 때문에 디폴트 인코딩을 euc-kr로 한다.
client.setControlEncoding("euc-kr");
// Test 서버 정보
logger.info("Commons NET FTP Client Test Program");
logger.info("Start GO");
// Novell TEST서버에 접속
client.connect("ftp.novell.com");
logger.info("Connected to ||||||||||||||||||||||...........");
// 응답코드가 비정상일 경우 종료함
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
client.disconnect();
logger.info("FTP server refused connection");
} else {
logger.info(client.getReplyString());
// timeout을 설정
client.setSoTimeout(10000);
// 로그인
client.login("anonymous", "anonymous");
logger.info("anonymous login success...");
// 각종 정보를 처리 (Put / Get / Append등)
client.logout();
}
} catch (Exception e) {
logger.info("해당 ftp 로그인 실패하였습니다.");
e.printStackTrace();
System.exit(-1);
} finally {
if(client != null && client.isConnected()){
try {
client.disconnect();
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
}
== 파일 리스트 보기 ==
FTPFile[] ftpfiles = client.listFiles("/");
if(ftpfiles != null ){
for (int i = 0; i < ftpfiles.length; i++) {
FTPFile file = ftpfiles[i];
logger.info(file.toString()); // 파일정보
logger.info(file.getName()); // 파일명
logger.info(file.getSize()); // 파일사이즈
}
}
== 파일 다운로드 (get) ==
File get_file = new File("c:\\temp\\test.jpg");
FileOutputStream outputstream = new FileOutputStream(get_file);
boolean result = client.retrieveFile("/public/test.jpg", outputstream);
outputstream.close();
== 파일 업로드 (put) ==
File put_file = new File("c:\\temp\\test.jpg");
inputStream = new FileInputStream(put_file);
boolean result = client.storeFile("/public/test.jpg", inputStream);
inputStream.close();
== 파일 업로드 (append) ==
File append_file = new File("c:\\temp\\test.jpg");
inputStream = new FileInputStream(append_file);
boolean result = client.appendFile("/public/test.jpg", inputStream);
inputStream.close();
== 파일 이름변경 (rename) ==
boolean result = client.rename("/public/바꾸기전.jpg", "/public/바꾼후.jpg");
== 파일 삭제 (delete) ==
boolean result = client.deleteFile("/public/삭제할.jpg");
== Dircetory 생성 ==
boolean result = client.makeDirectory("/public/test");
== OS 커맨드 입력하기 ==
client.sendCommand(FTPCommand.MAKE_DIRECTORY,"/public/test");
== 파일 및 전송상태 설정 ==
- 파일 타입 : FTP.BINARY_FILE_TYPE,, FTP.ASCII_FILE_TYPE, 등 설정
- 파일 전송 형태 : FTP.STREAM_TRANSFER_MODE, COMPRESSED_TRANSFER_MODE 등 설정
/* 파일 타입*/
client.setFileType(FTP.BINARY_FILE_TYPE);
/* 파일 전송 형태 */
client.setFileTransferMode(FTP.COMPRESSED_TRANSFER_MODE);
===== 참고자료 =====
[[http://commons.apache.org/net/|Jakarta Commons Net]]
[[http://commons.apache.org/net/apidocs/index.html|Commons Net 2.0 API]]