본문 바로가기
업무 기록/API

API 원격 서버 이미지 업로드(IP동시, Jsch, sftp)

by code2772 2023. 7. 12.

[ 목차 ]

    728x90
    반응형

    ✔  원격 서버의 IP 주소를 설정

    try {
    // init Server info
    String host_ip = HostAPI1;
    if(host_ip.equals(InetAddress.getLocalHost())) {
    host_ip = HostAPI2;


    host_ip와 로컬 호스트 IP 주소를 비교한다. 만약 두 값이 동일하다면, 즉 로컬 호스트에서 실행 중인 경우라면 host_ip 값을 HostAPI2로 변경한다. 이는 로컬 호스트에서 실행 중일 때는 다른 서버로 접속하기 위해 대체 IP 주소를 사용하는 것이다.

     
    ✔ JSch 객체 생성

    JSch jsch = new JSch();
    
    ?*
    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.54</version>
    </dependency>
    
    maven dependency 설정*/


    JSch 객체를 생성,  JSch는 Java로 SSH 연결을 위한 라이브러리

     
    ✔ SFTP 서버 SSH 세션

    session = jsch.getSession(username, host_ip, port);
    session.setPassword(password);


    jsch.getSession(username, host_ip, port)을 호출하여 SSH 세션을 생성합니다. username은 SFTP 서버의 사용자 이름, host_ip는 SFTP 서버의 IP 주소, port는 SFTP 서버의 포트 번호session.setPassword(password)를 사용하여 SFTP 서버의 비밀번호를 설정


    SFTP
    원격 서버에 접근위한 통신 규약으로 서버간의 데이터 전송을 암호화하기 때문에 해킹이나 보안상 문제점을 방지
    SFTP 포트 :  22
    ssh의 파일 전송 버전이라 생각
    ssh : 원격 서버에 엑세스 하기 위한 명령 인터페이스, 프로토콜  

     
    ✔ StrictHostChecking

    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.connect(); // 세션 연결


    java.util.Properties 객체를 생성하고, StrictHostKeyChecking 속성을 "no"로 설정하여 호스트 키 검사를 비활성화합니다.

    StrictHostKeyChecking 

    ssh 접속간 host의 key를 확인하지 않고 접속하는 방법

    ssh 사용해 원격에 있는 서버 접근할 때 서버 인증을 위해 로컬에 저장해둔 키와 서버의 키를 비교

    java.utils.Properties()

    "Key = Value" 형태로 된 "파일이름.properties" 파일 또는 Xml

    key를 제공하면 Value를 반환


    ✔ SFTP 채널설정

    channel = session.openChannel("sftp");
    channel.connect();
    channelSftp = (ChannelSftp) channel;
    String path = "/";


    session.openChannel("sftp")를 사용하여 SFTP 채널을 열고,  channel.connect() 호출하여 SFTP 채널을 연결한다. 파일을 업로드할 원격 경로를 설정합니다. channelSftp 객체를 생성하고, path 변수를 루트 경로로 초기화한다.

     
    ✔ 원격서버 경로 설정

    for (String pathCK : filePath.split("/")) {
        pathCK = pathCK + "/";
        path = path + pathCK;
    
        try {
            channelSftp.cd(path);
        } catch (SftpException e) {
            channelSftp.mkdir(path);
        }
    }


    channelSftp.cd(path); // cd() : paht로 경로 변경
    filePath를 /를 기준으로 분할하여 각 경로에 따라 디렉토리를 생성하거나 이미 존재하는 디렉토리로 이동한다.  channelSftp.cd(path)를 사용하여 원격 서버의 경로를 설정하고, 해당 경로가 존재하지 않으면 channelSftp.mkdir(path)를 사용하여 디렉토리를 생성한다.

    channelSftp.cd(path)를 호출하여 원격 서버의 현재 경로를 path로 변경합니다. 파일을 업로드할 디렉토리 경로로 이동하게 됩니다.

     

    ✔ 원격서버 이미지 업로드

    InputStream inputStream = image.getImage().getInputStream();
    channelSftp.put(inputStream, filenameWithFormat);
    
    channelSftp.exit();
    channel.disconnect();
    session.disconnect();


    image.getImage().getInputStream()을 사용하여 업로드할 이미지 파일의 입력 스트림을 가져온다.

    channelSftp.put(inputStream, filenameWithFormat)를 호출하여 이미지 파일을 원격 서버에 업로드합니다. inputStream은 이미지 파일의 입력 스트림이고, filenameWithFormat은 업로드할 파일의 이름

    channelSftp.exit() 호출하여 SFTP 채널을 종료

    channel.disconnect() 호출하여 채널 연결을 종료

    session.disconnect() 호출하여 SSH 세션을 종료

    위의 과정을 통해 이미지 파일은 filenameWithFormat의 이름으로 원격 서버에 업로드되며, 연결된 채널과 세션은 종료

    예외가 발생한 경우, 채널과 세션을 종료하고 JsonParser.parseString(...)을 사용하여 에러 응답을 생성하여 반환하고. 이 응답은 이미지 저장에 실패한 경우를 나타낸다.
     

    반응형