Programing/JAVA

JAVA FTP storeFile 반응 없을 시 해결 방법 Active / passive 모드 정리

리커니 2022. 1. 19. 12:45
반응형

JAVA FTP storeFile 반응 없을 시 해결 방법 Active / passive 모드 정리

Java 에서 FTP에 파이일을 업로드 할 때 사용하는 메소드가 storeFile 입니다.

사용하기 위해서는 commons-net 의 의존성을 추가해주셔야 합니다.

 

ex) gradle project

implementation group: 'commons-net', name: 'commons-net', version: '3.6'

 

 

커넥션이나 워킹 디렉토리 변경에는 아무 문제가 없었습니다.

그런데 sotreFile를 하면 아무 동작을 하지 않는 문제가 발생해습니다.

 

boolean storeResult = ftpClient.storeFile(saveFileNm, inputStream);

 

saveFileNm 은 업로드할 FTP의 경로 (FTP/upload)이고, inputStream은 업로드할 FileInputStream 입니다.

문제는 storeResult가 false 값이 리턴되고 동작이 하지 않는 부분입니다.

 

원인은 mode 설정이였습니다.

FTP 에 connetion 시 active 모드로 접속하고 있었고,

 

ftpClient.enterLocalActiveMode();

 

passive 모드로 변경하여 접속하니 아무 문제가 발생하지 않았습니다.

 

ftpClient.enterLocalPassiveMode();

 

 

Active mode는 접속은 클라이언트가 요청을 하지만

데이터를 주고받는 데이터 채널의 연결은 서버가 연결을 하게 됩니다.

이렇게 되면 클라이언트가 방화벽이나 기타 연결을 막는 설정이 있으면 제대로 동작하지 않을 수 있습니다.

 

Passive mode는 접속과 데이터채널의 연결을 모두 클라이언트가 하는 방식입니다.

 

각 방식으로 사용할 때 확인해야 될 사항을 정리해보겠습니다.

Active와 Passive mode 모두 둘다 클라이언트가 서버로 접속 요청을 하기 때문에 

서버 쪽에서는 FTP 접속 포트가 해제 또는 인바운드 규칙에 추가되어 있어야 합니다.

 

Active mode의 경우 위에서 설명한데로 데이터 채널을 서버가 요청하기 때문에 기본 포트인 20(변경을 하였다면 변경된 데이터 채널 포트) 이 서버쪽에는 아웃바운드, 클라이언트 쪽에는 인바운드 설정이 되어 있어야 합니다. 

 

Passive mode의 경우 데이터 채널을 클라이언트가 임의로 지정하게 됩니다. (1024 ~ 65535 사이의 사용 가능한 포트)

혹은 포트의 범위를 설정할 수 있습니다. 그렇게 되면 해당 범위 내의 포트가 FTP 서버에 인바운드 설정이 되어 있어야 합니다.

 

FTP 모드에 대해서는 큰 신경을 안썼었는데 이렇게 정리 할 기회는 주네요.

저와 같은 문제가 발생했을 때 많은 시간을 허비하지 않으셨으면 합니다.

 

반응형