파일을 전송하기 위한 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저장 또는 파일로 저장한다.
	}	
}

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기