2012-09-04 100 views
1

我設法創建一個將文件上傳到目錄的方法。如何使用JSch的SCP支持將文件複製到服務器上?

我該如何改變這個,才能通過JSch將文件從/123.html複製到/en/123.html?

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通道,直接發出服務器系統的複製命令。在unixoid服務器上,這將是cp /123.html /en/123.html。 (這裏假設你有服務器,而不是唯一的SFTP訪問shell訪問,因爲我已經沒有看到的地方。)

下面是一些代碼(未測試,你可能需要添加異常處理):

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

很棒@PaŭloEbermann。一個小調整:session.openChannel(「exec」); – adhg

相關問題