사용자의 로컬 환경이나 서버에 가지고 있는 파일을 도커 컨테이너로 옮기거나 그 반대의 기능이 필요한 경우가 많다. 이 때 JSch를 활용하여 sftp를 사용한다.
다음은 jsch를 활용한 sftp 접속 예시이다.
JSch jsch = new JSch();
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no"); // 호스트 정보 검사 안함
String host = "mySftpHost";
int port = "22";
String userName = "userName";
String password = "passWord";
Session session = jsch.getSession(userName, host, port);// 세션 생성
if(!"".equals(password) && password != null) {
session.setPassword(password);// 비밀번호 설정
}
// 설정 정보
session.setConfig(config);
// 접속
session.connect();
// sftp 채널접속
Channel fromChannel = session.openChannel("sftp");
fromChannel.connect();
ChannelSftp fromChannelSftp = (ChannelSftp) fromChannel;
내가 필요한 기능은 사용자가 원하는 서버의 디렉토리에 존재하는 모든 파일을 가져오는 것이다. 사실 이미 다른 팀원이 파일들을 가져오는 기능까지 구현해놓았다. 다만 csv파일을 가져오는 경우 각 csv 파일들의 컬럼 개수까지 가져올 필요성이 생겨 해당 기능을 추가하는 김에 관련 코드를 들여다보게 되었다.
우선 사용자가 원하는 경로의 파일들을 가져온다.
//파일 목록 가져오기
Vector<ChannelSftp.LsEntry> fileList = fromChannelSftp.ls("/your_directory");
그리고 해당 리스트에서 디렉토리들을 제외한 파일들에 대해 작업을 수행한다.
for(int i = 0; i < fileList.size(); i++) {
// 파일 이름이 ., .. 인 경우 디렉토리 패스
if(fileList.get(i).getFilename().equals(".") || fileList.get(i).getFilename().equals("..")) { continue; }
SftpATTRS sftpAttrs = fromChannelSftp.stat(parentPath + "/" + fileList.get(i).getFilename());
Map<String, Object> fileInfo = new HashMap<>();
fileInfo.put("FILE_NM", fileList.get(i).getFilename());
if(fileList.get(i).getFilename().endsWith(".csv")){
InputStream stream = fromChannelSftp.get("your_path" + "/" + fileList.get(i).getFilename());
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line = br.readLine();
if(line != null){
String [] columns = line.split(",");
int colNums = columns.length;
fileInfo.put("FILE_COLUMN_CNT", colNums);
}
}
if(sftpAttrs.isDir()) {
fileInfo.put("IS_DIR", true);
} else {
fileInfo.put("IS_DIR", false);
}
returnFileList.add(fileInfo);
}
. 이나 .. 등 디렉토리 구조를 나타내는 것들을 제외한 파일들에 대해서 작업을 수행한다.
우선 SftpATTRS의 isDir 함수를 사용해 현재 디렉토리 내부에서 가져온 파일들이 디렉토리인지 아닌지 그 속성을 저장한다. 실제 웹 화면에서 사용자가 설정한 디렉토리의 파일 목록을 보여줄 때 IS_DIR 속성을 통해 해당 내용을 보여줄지 말지 결정한다.
파일 이름이 csv로 끝나는 경우엔 InputStream을 통해 sftp로 연결된 서버의 파일들을 가져와 BufferedReader로 제일 첫 줄을 읽는다. csv 파일에서 헤더는 쉼표(,)로 구분되므로 첫 줄의 문자열들을 쉼표로 구분하여 그 길이를 저장한다.
'JAVA' 카테고리의 다른 글
자바 빈(Bean) 이란 무엇인가? (0) | 2021.05.06 |
---|---|
파일 입출력 연습 (0) | 2021.05.06 |
상속-기본예제 (0) | 2021.03.29 |
Java - If 문의 사용 (0) | 2021.03.29 |
클래스와 메소드 예제 1 (0) | 2021.03.18 |