[JAVA] java에서 sftp 연결하기-jsch라이브러리

Yuri Lee·2024년 8월 7일
0

JAVA

목록 보기
15/16
post-custom-banner

이 포스트에서는 java에서 sftp에 연결해 파일을 업로드, 다운로드, 삭제하는 방법을 설명해보도록 하겠다.

1. jar파일 다운로드

http://www.jcraft.com/jsch/
jsch-0.1.42.jar 받기

2. sftpUtil 작성

package util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.craft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

/**
* 서버와 연결하여 파일을 업로드하고, 다운로드한다. 
*
* @author 
* @since 
*
*/
public class sftpUtil{
	private Session session = null;
    private Channel channel = null;
    private ChannelSftp channelSftp = null;
    
   /**
    * 서버와 연결하여 파일을 업로드하고, 다운로드한다. 
    *
    * @author 
    * @since 
    *
    */
    public void init(String host, String userName, String password, int port){
    	JSch jsch = new JSch();
        try{
        	session = jsch.getSession(userName, host, port); 
            session.setPassword(password);
            
            // 프로퍼티 설정 
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no"); //접속 시 hostkeychecking 여부
            session.setConfig(config);
            session.connect();
            
            //sftp 접속
            channel = sessjion.openChannel("sftp");
            channel.connect();

        }catch(JSchException e){
        	e.printStackTrace();
        }
        
        channelSftp = (ChannelSftp) channel; //channelSftp 초기화
    }
    
   /**
    * 서버와 연결하여 파일을 업로드하고, 다운로드한다. 
    *
    * @author 
    * @since 
    *
    */
    public void upload(String dir, File file){
		FileInputStream in = null;
        try{
        	//FileInputStream 파일로부터 바이트로 입력받아 바이트 단위로 출력하는 클래스
            // channelSftp.put의 첫번째 인자의 형태
        	in = new FileInputStream(file); 
            channelSftp.cd(dir);
            channelSftp.put(in, file.getName()); //(업로드할 파일, 파일명지정)
        }catch(SftpException e){
        	e.printStackTrace();
        }catch(FileNotFoundException e){
        	e.printStackTrace();
        }finally{
        	try{
            	in.close();
            }catch(IOException e){
            	e.printStackTrace();
            }
        }
    }
  	/**
     * 하나의 파일을 다운로드 한다.
     *    
     * @param dir                 저장할 경로(서버)
     * @param downloadFileName    다운로드할 파일
     * @param path                저장될 공간
     */
     public void download(String dir, String downloadFileName, String path){
     	InputStream in = null;
        FileOutputStream out = null;
        
        try{
        	channelSftp.cd(dir);
            in = channelSftp.get(downloadFileName);
        }catch(SftpException e){
        	e.printStackTrace();
        }
        
        try{
        	out = new FileOutputStream(new File(path));
            int i;
            
            while((i=in.read())!= -1){
            	out.write(i);
            }
        }catch(IOException e){
        	e.printStackTrace();
        }finally{
        	try{
            	out.close();
                in.close();
            }catch(IOException e){
            	e.printStackTrace();
            }
        }
     }
     
    /**
     * 서버와의 연결을 끊는다.
     */
    public void disconnection() {
        channelSftp.quit();
    }
    
}

3. 메인클래스

public static void main(String args[]){
	String host = "sftp주소";
    int port = 포트번호;
    String userName = "아이디";
    String password = "비밀번호";
    String dir = "/폴더명/"; // 접근할 폴더가 위치할 경로
    String file = "f:\\test.txt(업로드시킬 파일)";
    
    UsigFTP util = new sftpUtil();
    util.init(host, userName, password, port);
    util.upload(dir, new File(file));
    
    String fileName = "다운로드 받을 파일명"; // ex) test.txt
    String saveDir = "저장할 위치" // ex) f:\\test3.txt
    
    util.download(dir, fileName, saveDir);
    
    util.disconnection();
    System.exit(0);
}

REFERENCES

https://blog.naver.com/weekamp/220698186865

profile
유리
post-custom-banner

0개의 댓글