1

我设法创建了一种将文件上传到目录的方法。

我将如何更改它以便我可以通过 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;
    }
}
4

1 回答 1

2

我了解您的问题,您希望将服务器上的文件从一个目录复制到另一个目录(而不是将本地文件复制到服务器,您的代码似乎已经这样做了)。

不幸的是,SFTP 协议(​​由 JSch 的 ChannelSFTP 类实现)不支持直接在服务器上复制。您当然可以结合putget将文件从一个位置复制到另一个位置,但这将通过线路将内容从服务器两次发送到客户端并返回。

更好的方法是使用exec通道,直接发出服务器系统的复制命令。在 unixoid 服务器上,这将是cp /123.html /en/123.html. (这假设您对服务器具有 shell 访问权限,而不是仅 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);
}
于 2012-09-22T17:47:00.167 回答