JAVA

JSch를 활용하여 외부 서버 파일 가져오기(파일 컬럼 개수)

bysnow 2024. 4. 11. 09:33
728x90
반응형
SMALL

사용자의 로컬 환경이나 서버에 가지고 있는 파일을 도커 컨테이너로 옮기거나 그 반대의 기능이 필요한 경우가 많다. 이 때 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 파일에서 헤더는 쉼표(,)로 구분되므로 첫 줄의 문자열들을 쉼표로 구분하여 그 길이를 저장한다.

 

728x90
반응형
LIST

'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