1. 程式人生 > 實用技巧 >Java對於遠端檔案的上傳和下載

Java對於遠端檔案的上傳和下載

1. 在 pom.xml 引入以下依賴

<dependency>
    <groupId>ch.ethz.ganymed</groupId>
    <artifactId>ganymed-ssh2</artifactId>
    <version>build210</version>
</dependency>

2. 相關程式碼

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;

/**
 * 從遠端伺服器上用scp命令下載檔案
 */
public class SCPClientUtil {
    private static final Logger logger = LoggerFactory.getLogger(SCPClientUtil.class);

    private static SCPClientUtil instance;

    // 多執行緒呼叫加鎖
    public static synchronized SCPClientUtil getInstance(String ip, int port, String username, String password) {
        if (instance == null) {
            instance = new SCPClientUtil(ip, port, username, password);
        }
        return instance;
    }

    /**
     * 建構函式,賦值的過程
     * @param ip    ip
     * @param port  埠號
     * @param username  使用者名稱
     * @param password  密碼
     */
    public SCPClientUtil(String ip, int port, String username, String password) {
        this.ip = ip;
        this.port = port;
        this.username = username;
        this.password = password;
    }

    /**
     * 從伺服器下載檔案
     * @param remoteFile        遠端伺服器檔案所在位置(路徑+檔名)
     * @param localDirectory    下載檔案儲存到本地的路徑
     */
    public void getFile(String remoteFile, String localDirectory) {
        Connection conn = new Connection(ip, port);

        try {
            conn.connect();
            boolean authenticate = conn.authenticateWithPassword(username, password);
            if(authenticate) {
                SCPClient client = new SCPClient(conn);

                Session session = conn.openSession();   // 連線之後,可以執行任意xshell命令

                if(!"root".equals(username)) {
                    session.execCommand("chmod u+rwx "+ remoteFile); // 增加檔案可操作許可權,一般root使用者不用增加
                }

                File file = new File(localDirectory);
                if(!file.exists()) {    // 判斷此路徑在本地是否存在
                    file.mkdirs();  // 建立路徑
                }

                client.get(remoteFile, localDirectory);     // 下載檔案

                session.execCommand("rm -rf "+ remoteFile); // 下載完成後,刪除伺服器上原始檔

                session.close();
                conn.close();
            }else {
                logger.info("建立連線失敗");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 把本地檔案上傳到伺服器
     * @param localFile         本地檔案所在位置(路徑+檔名)
     * @param remoteDirectory   上傳檔案儲存的伺服器位置路徑
     */
    public void putFile(String localFile, String remoteDirectory) {
        Connection conn = new Connection(ip, port);

        try {
            conn.connect();
            boolean authenticate = conn.authenticateWithPassword(username, password);
            if(authenticate) {
                SCPClient client = new SCPClient(conn);
                client.put(localFile, remoteDirectory); // 上傳檔案

                conn.close();
            }else {
                logger.info("建立連線失敗");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String ip;  // 伺服器ip地址

    private Integer port;   // 開放埠號

    private String username;    // ssh使用者名稱

    private String password;    // ssh密碼

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3. 呼叫方式

@GetMapping("/get")
public void get() {
    SCPClientUtil instance = SCPClientUtil.getInstance("192.168.31.11", 22, "root", "admin12.");

    // 從伺服器下載檔案
    instance.getFile("/000/test/test.txt", "/Users/Desktop/");
}

@GetMapping("/put")
public void put() {
    SCPClientUtil instance = SCPClientUtil.getInstance("192.168.31.11", 22, "root", "admin12.");

    // 上傳檔案到伺服器
    instance.putFile("/Users/Desktop/test.txt", "/000/test/");
}