Как я могу скопировать файл на сервер, используя поддержку SCP JSch?

Мне удалось создать метод, который загружает файл в каталог.

Как мне изменить это, чтобы я мог скопировать файл из /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 ответ

Я понимаю ваш вопрос о том, что вы хотите скопировать файл на сервере из одного каталога в другой (а не локальный файл на сервер, что, похоже, уже делает ваш код).

К сожалению, протокол SFTP (который реализуется классом ChannelSFTP JSch) не поддерживает копирование непосредственно на сервер. Вы, конечно, можете объединить put а также get скопировать файл из одного места в другое, но при этом содержимое будет дважды отправлено по сети с сервера на клиент и обратно.

Лучшим способом было бы использовать exec канал, и просто напрямую выполнить команду копирования системы сервера. На сервере Unixoid это будет 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);
}
Другие вопросы по тегам