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 クラスによって実装されている) は、サーバー上での直接のコピーをサポートしていません。putとを組み合わせて、ある場所から別の場所にファイルをコピーすることは確かにできgetますが、これではコンテンツがネットワーク経由でサーバーからクライアントに 2 回送信され、戻ってきます。

より良い方法は、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);
}
于 2012-09-22T17:47:00.167 に答える