From c631bb09e87c2b9fe90656d13a6a8d52244e6332 Mon Sep 17 00:00:00 2001 From: leebeomjun Date: Tue, 19 Sep 2023 18:19:02 +0900 Subject: [PATCH] =?UTF-8?q?FTP=EA=B4=80=EB=A0=A8=20=EC=9C=A0=ED=8B=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +- .../java/cokr/xit/fims/cmmn/ftp/FTPUtil.java | 160 ++++++++++++++++++ .../xit/fims/cmmn/ftp/remoteSystemInfo.java | 13 ++ 3 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cokr/xit/fims/cmmn/ftp/FTPUtil.java create mode 100644 src/main/java/cokr/xit/fims/cmmn/ftp/remoteSystemInfo.java diff --git a/pom.xml b/pom.xml index 165f7a52..583b328f 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,13 @@ pdfbox 3.0.0 - + + + + commons-net + commons-net + 2.2 + 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..79190c7a --- /dev/null +++ b/src/main/java/cokr/xit/fims/cmmn/ftp/FTPUtil.java @@ -0,0 +1,160 @@ +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) { + + FTPClient client = null; + try { + + 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"); + client.connect(rs.getIp(), 21); + + // 접속을 확인. + int resultCode = client.getReplyCode(); + if (!FTPReply.isPositiveCompletion(resultCode)) { + System.out.println("FTP server refused connection.!"); + throw new RuntimeException("접속 오류"); + } + + client.setSoTimeout(1000); + // 로그인을 한다. + if (!client.login(rs.getId(), rs.getPw())) { + System.out.println("Login Error!"); + throw new RuntimeException("로그인 오류"); + } + + + List remoteFiles = new ArrayList<>(); + List remoteDirectories = new ArrayList<>(); + + // FTP에서 파일 리스트와 디렉토리 정보를 취득한다. + if (!FTPUtil.getFileList(client, remoteSystemFileSeparator, remoteWorkPath, remoteFiles, remoteDirectories)) { + // 리스트 취득 실패시 프로그램을 종료한다. + System.out.println("File search Error!"); + throw new RuntimeException("오류 발생"); + } + + 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("오류 발생"); + } finally { + // ftp 커넥션이 연결되어 있으면 종료한다. + try { + if (client.isConnected()) { + client.disconnect(); + } + } catch (Throwable e) { + e.printStackTrace(); + } + } + + return true; + } + + // FTP의 파일 리스트와 디렉토리 정보를 취득하는 함수. + public static boolean getFileList(FTPClient client, String fileSeparator, String work, List files, List directories) { + System.out.println("work is "+work); + + // FTP의 디렉토리 커서를 이동한다. + try { + if (client.changeWorkingDirectory(work)) { + System.out.println("커서이동 성공"); + // 해당 디렉토리의 파일 리스트를 취득한다. + 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); + + } else { + System.out.println("커서이동 실패"); + } + } catch (IOException e) { + System.out.println("유틸 에러"); + e.printStackTrace(); + } + + // 커서 이동에 실패하면 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..e02622b8 --- /dev/null +++ b/src/main/java/cokr/xit/fims/cmmn/ftp/remoteSystemInfo.java @@ -0,0 +1,13 @@ +package cokr.xit.fims.cmmn.ftp; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class remoteSystemInfo { + String ip; + String id; + String pw; + String osType; +}