Как я могу скопировать файл на сервер, используя поддержку 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);
}