2012-09-04 1 views
1

파일을 디렉토리에 업로드하는 방법을 만들었습니다.JSch의 SCP 지원을 사용하여 서버에서 파일을 복사하는 방법은 무엇입니까?

/123.html에서 /en/123.html로 JSch를 통해 파일을 복사 할 수 있도록 어떻게 변경해야합니까?

public void upFile(String source, String fileName, String destination) throws Exception { 
    try { 

     try { 
      // 改变当前路径 
      client.cd(destination); 
     } catch (Exception e) { 
      System.out.println("当前目录不存在,新建目录!"); 
      JschCreateDir.createDir(host, port, username, password, destination); 
      client.cd(destination); 
     } 

     // 上传本地文件 到当前目录 
     File file = new File(source + fileName); 
     client.put(new FileInputStream(file), fileName); 

    } catch (Exception e) { 
     logout(); 
     throw e; 
    } 
} 
+1

참고 : 이미 서버에 있고 (클라이언트 객체로) 디렉토리가 존재하지 않는다는 것을 알았다면,이 연결을 사용하여'createDir '메소드를 호출합니다. –

답변

2

나는 (당신의 코드가 이미 할 것으로 보인다 아닌 서버에 로컬 파일) 다른 하나에 하나의 디렉토리에서 서버에 파일을 복사 할 질문을 이해합니다.

SFTP 프로토콜 (JSch의 ChannelSFTP 클래스에서 구현 됨)은 서버에서 직접 복사를 지원하지 않습니다. putget을 결합하여 한 위치에서 다른 위치로 파일을 복사 할 수는 있지만 서버에서 클라이언트로, 그리고 뒤로 이동하여 두 번 내용을 전송합니다.

더 좋은 방법은 exec 채널을 사용하고 서버 시스템의 copy 명령을 직접 실행하는 것입니다. 유닉스 서버에서는 cp /123.html /en/123.html이됩니다. (이것은 내가 이미 어딘가에 볼 그랬던 것처럼 당신이 서버가 아닌 SFTP 전용 액세스에 쉘 액세스 할 수 있습니다 가정합니다.) 여기

이 몇 가지 코드 (테스트하지, 당신은 예외 처리를 추가해야 할 수도 있습니다)입니다 :

public void copyFile(Session session, String sourceFile, String destinationFile) { 
    ChannelExec channel = (ChannelExec) session.openChannel("exec"); 
    channel.setCommand("cp " + sourceFile + " " + destinationFile); 
    channel.connect(); 
    while(channel.isConnected()) { 
     Thread.sleep(20); 
    } 
    int status = channel.getExitStatus(); 
    if(status != 0) 
     throw new CopyException("copy failed, exit status is " + status); 
} 
+1

great @ Paŭlo Ebermann. 하나의 사소한 수정 : session.openChannel ("exec"); – adhg