diff --git a/pom.xml b/pom.xml index 3c8948ee..830fb5e1 100644 --- a/pom.xml +++ b/pom.xml @@ -123,7 +123,24 @@ 1.0.0-SNAPSHOT - + + + commons-net + commons-net + 3.10.0 + + + commons-discovery + commons-discovery + 0.5 + + + + com.github.mwiede + jsch + 0.2.20 + + cokr.xit.interfaces diff --git a/src/main/java/cokr/xit/fims/cmmn/ftp/FTPUtil.java b/src/main/java/cokr/xit/fims/cmmn/ftp/FTPUtil.java new file mode 100644 index 00000000..87e85121 --- /dev/null +++ b/src/main/java/cokr/xit/fims/cmmn/ftp/FTPUtil.java @@ -0,0 +1,164 @@ +package cokr.xit.fims.cmmn.ftp; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; + +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPFile; +import org.apache.commons.net.ftp.FTPReply; + +public class FTPUtil { + public static boolean fileDown(RemoteSystemInfo rs, String remoteWorkPath, String downloadRoot) { + + File f = new File(downloadRoot + remoteWorkPath); + f.mkdirs(); + + FTPClient client = null; + + String thisSystemFileSeperator = File.separator; + + String remoteSystemFileSeparator = rs.getOsType().equals("linux") ? "/" : "\\"; + + if(!thisSystemFileSeperator.equals(remoteSystemFileSeparator)) { + remoteWorkPath = remoteWorkPath.replaceAll( + Matcher.quoteReplacement(thisSystemFileSeperator), + Matcher.quoteReplacement(remoteSystemFileSeparator) + ); + } + + client = new FTPClient(); + client.setControlEncoding("UTF-8"); + try { + client.connect(rs.getIp(), Integer.parseInt(rs.getPort())); + } catch (Exception e) { + throw new RuntimeException("접속 오류."); + } + + // 접속을 확인. + int resultCode = client.getReplyCode(); + if (!FTPReply.isPositiveCompletion(resultCode)) { + throw new RuntimeException("접속 오류 : FTP server refused connection."); + } + + try { + client.setSoTimeout(1000); + } catch (Exception e) { + throw new RuntimeException("접속 오류."); + } + + boolean loginResult = false; + try { + // 로그인을 한다. + loginResult = client.login(rs.getId(), rs.getPw()); + } catch (Exception e) { + throw new RuntimeException("로그인 오류 : Login Error"); + } + + if (!loginResult) { + throw new RuntimeException("로그인 오류 : Login Error"); + } + + List remoteFiles = new ArrayList<>(); + List remoteDirectories = new ArrayList<>(); + + // FTP에서 파일 리스트와 디렉토리 정보를 취득한다. + if (!FTPUtil.getFileList(client, remoteSystemFileSeparator, remoteWorkPath, remoteFiles, remoteDirectories)) { + // 리스트 취득 실패시 프로그램을 종료한다. + throw new RuntimeException("파일 조회 오류 발생 : File search Error"); + } + + for (String remoteDirectory : remoteDirectories) { + System.out.println("디렉토리-"+remoteDirectory); + + String newFolderPath = ""; + if(thisSystemFileSeperator.equals(remoteSystemFileSeparator)) { + newFolderPath = downloadRoot + remoteDirectory; + } else { + newFolderPath = downloadRoot + remoteDirectory.replaceAll( + Matcher.quoteReplacement(remoteSystemFileSeparator), + Matcher.quoteReplacement(thisSystemFileSeperator) + ); + } + + File folder = new File(newFolderPath); + folder.mkdirs(); + } + + + for (String remoteFile : remoteFiles) { + System.out.println("파일-"+remoteFile); + + String tempFileOutputPath = ""; + + if(thisSystemFileSeperator.equals(remoteSystemFileSeparator)) { + tempFileOutputPath = downloadRoot + remoteFile; + } else { + tempFileOutputPath = downloadRoot + remoteFile.replaceAll( + Matcher.quoteReplacement(remoteSystemFileSeparator), + Matcher.quoteReplacement(thisSystemFileSeperator) + ); + } + + + try (FileOutputStream fo = new FileOutputStream(tempFileOutputPath)){ + //FTPClient의 retrieveFile함수로 보내면 다운로드가 이루어 진다. + if (client.retrieveFile(remoteFile, fo)) { + System.out.println("Download - " + remoteFile); + } + } catch(Exception e) { + throw new RuntimeException("파일 다운로드 오류"); + } + + } + + try { + client.disconnect(); + } catch(Exception e) { + throw new RuntimeException("파일 다운로드 오류"); + } + return true; + } + + // FTP의 파일 리스트와 디렉토리 정보를 취득하는 함수. + public static boolean getFileList(FTPClient client, String fileSeparator, String work, List files, List directories) { + + // FTP의 디렉토리 커서를 이동한다. + try { + if (client.changeWorkingDirectory(work)) { + + // 해당 디렉토리의 파일 리스트를 취득한다. + for (FTPFile file : client.listFiles()) { + + if (!file.isFile()) { + // 디렉토리리면 함수의 재귀적 방식으로 하위 탐색을 시작한다. + if(!getFileList(client, fileSeparator, work + file.getName() + fileSeparator, files, directories)) { + return false; + } + + // directories 리스트에 디렉토리 경로를 추가한다. + directories.add(work + file.getName() + fileSeparator); + } else { + // files 리스트에 경로를 추가한다. + files.add(work + file.getName()); + } + + } + // FTP의 디렉토리 커서를 상위로 이동하는 함수 + // client.changeToParentDirectory(); + + // FTP의 디렉토리 커서를 이동한다. + return client.changeWorkingDirectory(fileSeparator); + + } + } catch (IOException e) { + throw new RuntimeException("ftp오류."+e); + } + + // 커서 이동에 실패하면 false를 리턴한다. + return false; + } +} diff --git a/src/main/java/cokr/xit/fims/cmmn/ftp/RemoteSystemInfo.java b/src/main/java/cokr/xit/fims/cmmn/ftp/RemoteSystemInfo.java new file mode 100644 index 00000000..98174301 --- /dev/null +++ b/src/main/java/cokr/xit/fims/cmmn/ftp/RemoteSystemInfo.java @@ -0,0 +1,15 @@ +package cokr.xit.fims.cmmn.ftp; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RemoteSystemInfo { + String ip; + String port; + String id; + String pw; + String osType; + String workPath; +} diff --git a/src/main/java/cokr/xit/fims/cmmn/ftp/SFTPUtil.java b/src/main/java/cokr/xit/fims/cmmn/ftp/SFTPUtil.java new file mode 100644 index 00000000..a808683a --- /dev/null +++ b/src/main/java/cokr/xit/fims/cmmn/ftp/SFTPUtil.java @@ -0,0 +1,93 @@ +package cokr.xit.fims.cmmn.ftp; + +import java.io.IOException; +import java.io.InputStream; + +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpException; + +public class SFTPUtil { + + private ChannelSftp channelSftp = null; + private Session session = null; + + public boolean connect(RemoteSystemInfo rs) { + + JSch jsch = new JSch(); + Channel channel = null; + + //세션객체 생성 + try { + + session = jsch.getSession(rs.getId(), rs.getIp(), Integer.parseInt(rs.getPort())); + + session.setPassword(rs.getPw()); + + //세션관련 설정정보 설정 + java.util.Properties config = new java.util.Properties(); + + //호스트 정보 검사하지 않는다. + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + + session.setTimeout(10000); + session.connect(); //접속 + channel = session.openChannel("sftp"); //sftp 채널 접속 + channel.connect(); + } catch (NumberFormatException e) { + throw new RuntimeException("[F] FTP 접속 오류"); + } catch (JSchException e) { + throw new RuntimeException("[F] FTP 접속 오류"); + } + channelSftp = (ChannelSftp) channel; + + + String remoteWorkPath = rs.getWorkPath(); + try { + channelSftp.cd(remoteWorkPath); + } catch (SftpException e) { + throw new RuntimeException("[F] FTP 경로 이동 오류"); + } + + return true; + } + + public byte[] getBytesObj(String path) { + InputStream is; + try { + is = channelSftp.get(path); + } catch (SftpException e) { + throw new RuntimeException("[F] FTP 파일 읽기 오류"); + } + + if(is == null) { + return null; + } + + byte[] bytesOfFile; + try { + bytesOfFile = is.readAllBytes(); + } catch (IOException e) { + throw new RuntimeException("[F] FTP 파일 읽기 오류"); + } + + try { + is.close(); + } catch (IOException e) { + throw new RuntimeException("[F] FTP 파일 읽기 오류"); + } + + return bytesOfFile; + } + + public boolean disconnect() { + + session.disconnect(); + + return true; + } +}