파일을 전송하기 위한 SFTP파일 전송 처리용 유틸클래스를 만들어 보겠습니다.
Jsch를 사용하면 SFTP를 연결하고 전송 할 수 있습니다.
먼저 jsch를 dependency 에 추가한다.
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
이제 SFTPUitl 을 생성한다.
public class SFTPUtil {
private static Logger log = LogManager.getLogger(SFTPUtil.class);
private static Session session;
private static Channel channel;
private static ChannelSftp channelSftp;
private static String reqServer = "";
private static String reqServerCd = "";
private static String targetServer = "";
private static String userId = "";
/**
* <p>SFTP 서버연결
*
* @param strUser 로그인 사용자
* @return null
* <p><pre>
* - 사용 예
* SFTPUtil sftp = new SFTPUtil();
sftp.init(strUser);
* </pre>
*/
public void init(String strUser) throws Exception {
this.userId = strUser;
InetAddress inet = InetAddress.getLocalHost();
String svrIPList[] = null;
svrIPList = null;//PropUtil.getProperty("SFTP_IP").trim().split(",");
int i = 0 ;
int cnt = svrIPList.length;
for (i = 0; i < cnt; ++i) {
svrIPList[i] = svrIPList[i].replaceAll("\n", "");
svrIPList[i] = svrIPList[i].replaceAll(" ", "");
svrIPList[i] = svrIPList[i].replaceAll("\t", "");
//sftp IP 리스트중 현재 서버 IP와 동일한 IP추 출
if(svrIPList[i].equals(inet.getHostAddress())) {
this.reqServer = svrIPList[i];
break;
}
}
if(cnt >=2) {
if(!"".equals(this.reqServer)) {
int seq = 0;
if(i > (cnt/2) -1) {
this.reqServerCd = "2";
seq = i - (cnt/2);
} else {
this.reqServerCd = "1";
seq = i + (cnt/2);
}
this.targetServer = svrIPList[seq];
}
}
if("".equals(this.targetServer)) return;
String user = null;//PropUtil.getProperty("SFTP_USER");
String password = null;//PropUtil.getProperty("SFTP_PWD");
// JSch 객체 생성
JSch jsch = new JSch();
try {
// 세션객체 생성 ( user , host, port )
session = jsch.getSession(user, targetServer);
// password 설정
session.setPassword(password);
// 세션관련 설정정보 설정
java.util.Properties config = new java.util.Properties();
// 호스트 정보 검사하지 않는다.
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// 접속
session.connect();
// sftp 채널 접속
channel = session.openChannel("sftp");
channel.connect();
} catch (JSchException e) {
log.error(e.getMessage().replaceAll("[\r\n]",""));
}
channelSftp = (ChannelSftp) channel;
// channelSftp.setFilenameEncoding(ChannelSftp.EUCKR);
}
/**
* <p>단일 파일 업로드
*
* @param strPath 파일경로
* @param file 파일정보
* @param seq 시퀀스
* @return null
* <p><pre>
* </pre>
*/
public int upload(String strPath, File file, String seq) throws Exception {
if("".equals(this.targetServer)) return 0;
FileInputStream in = null;
Map data = new HashMap();
data.put("SEQ" , seq);
data.put("REQ_CENTER", this.reqServerCd);
data.put("REQ_IP" , this.reqServer);
data.put("DSTN_IP" , this.targetServer);
data.put("REQ_USER" , this.userId);
data.put("FILE_PATH" , strPath);
data.put("FILE_NM" , file.getName());
int lastModifiedTime = 0;
String path = strPath + File.separator + file.getName();
try { // 파일을 가져와서 inputStream에 넣고 저장경로를 찾아 put
in = new FileInputStream(file);
mkdirDir(strPath);
channelSftp.put(in, file.getName());
lastModifiedTime = (int) (file.lastModified() / 1000L);
channelSftp.setMtime(path, lastModifiedTime); //타센타 파일 시간 변경
file.setLastModified(file.lastModified()); //본세터 파일 시간 변경
data.put("TR_STATUS" , "1");
return 1;
} catch (Exception e) {
data.put("TR_STATUS" , "2");
return 0;
} finally {
try {
if(in != null) in.close();
} catch (IOException ioe) {
log.error(ioe.getMessage().replaceAll("[\r\n]",""));
}
if(!"".equals(this.targetServer)) setLog(data);
}
}
/**
* <p>원격지 폴더 생성
*
* @param strPath 파일경로
* @return null
* <p><pre>
* </pre>
*/
public void mkdirDir(String path) throws SftpException {
String[] pathArray = path.split("/");
String totPathArray = "";
for (int i = 0; i < pathArray.length; i++) {
totPathArray += pathArray[i] + "/";
String currentPath = totPathArray;
try {
channelSftp.mkdir(currentPath);
channelSftp.cd(currentPath);
} catch (SftpException e) {
channelSftp.cd(currentPath);
}
}
}
/**
* <p>세션 종료
*
* @return null
* <p><pre>
* </pre>
*/
public void disconnect() {
if("".equals(this.targetServer)) return;
channelSftp.quit();
session.disconnect();
}
/**
* <p>SFTP전송로그 저장
*
* @return data DB저장정보
* <p><pre>
* </pre>
*/
private void setLog(Map data)throws Exception {
//Log를 DB저장 또는 파일로 저장한다.
}
}