Java對於遠端檔案的上傳和下載
阿新 • • 發佈:2020-11-17
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/"); }