sftp和ftp 根據(jù)配置遠(yuǎn)程服務(wù)器地址下載文件到當(dāng)前服務(wù)
廢話不多說,關(guān)鍵代碼如下所示:
package com.eastrobot.remote; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.eastrobot.util.PropertiesUtil; /** * full.zhang * * ftp/sftp抽象方法類 * */ public abstract class FileRemote { private static final String FTP_MODE = "ftp"; private static final String SFTP_MODE = "sftp"; public static String ftproot; public static String mode; public static String host; public static String username; public static String password; public static String port; private static FileRemote client = null; // 最大一次性下載50個文件 public static int max = 50; private final static Log LOGGER = LogFactory.getLog(FileRemote.class); public static FileRemote getInstance() { if (client == null) { ftproot = PropertiesUtil.getString("transfer.root"); mode = PropertiesUtil.getString("transfer.mode"); host = PropertiesUtil.getString("transfer.host"); username = PropertiesUtil.getString("transfer.username"); password = PropertiesUtil.getString("transfer.password"); port = PropertiesUtil.getString("transfer.port"); if (mode.equals(FTP_MODE)) { client = new FileFtpRemote(); } else if (mode.equals(SFTP_MODE)) { client = new FileSftpRemote(); } } return client; } /** * 執(zhí)行定時(shí)任務(wù) */ public void process() { LOGGER.debug("----------------------------------------進(jìn)入定時(shí)下載遠(yuǎn)程文件"); // 創(chuàng)建線程池 ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(new Runnable() { @Override public void run() { // 建立連接 initFtpInfo(host, port, username, password); // 遠(yuǎn)程服務(wù)所有源文件路徑集合 List<String> listSourcePath = listRemoteFilePath(ftproot); if (listSourcePath.isEmpty()) { LOGGER.debug("____________________釋放連接"); client.closeConnection(); return; } if (listSourcePath.size() > max) { listSourcePath = listSourcePath.subList(0, max); } for (String path : listSourcePath) { downloadRemoteFile(path); } LOGGER.debug("____________________釋放連接"); client.closeConnection(); } }); exec.shutdown(); } /** * 初始化連接 * * @param host * @param port * @param username * @param password * @throws Exception * @return */ public abstract void initFtpInfo(String host, String port, String username, String password); /** * 下載遠(yuǎn)程服務(wù)下文件到本地服務(wù) * * @param path * @return * @throws Exception */ public abstract void downloadRemoteFile(String filePath); /** * 獲取遠(yuǎn)程服務(wù)下指定目錄下的所有文件路徑集合(包含子目錄下文件) * * @param path * @return */ public abstract List<String> listRemoteFilePath(String path); /** * 釋放連接 */ public abstract void closeConnection(); } [java] view plain copy package com.eastrobot.remote; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import com.eastrobot.command.Commander; public class FileFtpRemote extends FileRemote { protected FTPClient ftpClient; private String encoding = "UTF-8"; private boolean binaryTransfer = true; private final static Log LOGGER = LogFactory.getLog(FileFtpRemote.class); @Override public void initFtpInfo(String host, String port, String username, String password) { try { // 構(gòu)造一個FtpClient實(shí)例 ftpClient = new FTPClient(); // 設(shè)置字符集 ftpClient.setControlEncoding(encoding); // 連接FTP服務(wù)器 ftpClient.connect(host, StringUtils.isNotBlank(port) ? Integer.valueOf(port) : 21); // 連接后檢測返回碼來校驗(yàn)連接是否成功 int reply = ftpClient.getReplyCode(); if (FTPReply.isPositiveCompletion(reply)) { // 登陸到ftp服務(wù)器 if (ftpClient.login(username, password)) { setFileType(); } ftpClient.login(username, password); } else { ftpClient.disconnect(); LOGGER.error("ftp服務(wù)拒絕連接!"); } } catch (Exception e) { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); // 斷開連接 } catch (IOException e1) { LOGGER.error("ftp服務(wù)連接斷開失敗!"); } } LOGGER.error("ftp服務(wù)連接失敗!"); } } /** * 設(shè)置文件傳輸類型 */ private void setFileType() { try { if (binaryTransfer) { ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); } else { ftpClient.setFileType(FTPClient.ASCII_FILE_TYPE); } } catch (IOException e) { e.printStackTrace(); } } @Override public void downloadRemoteFile(String filePath) { if (StringUtils.endsWith(filePath, "/") || StringUtils.endsWith(filePath, File.separator)) { filePath = filePath.substring(0, filePath.length() - 1); } File saveFile = new File(filePath); if (saveFile.exists()) { return; } // 文件所在目錄 String path = filePath.substring(0, filePath.lastIndexOf("/")); if (!StringUtils.endsWith(path, "/") && !StringUtils.endsWith(path, File.separator)) { if (Commander.isLinux) { path = path + File.separator; } else { path = path + "/"; } } OutputStream output = null; try { // 創(chuàng)建目標(biāo)文件路徑 if (!saveFile.getParentFile().exists()) { saveFile.getParentFile().mkdirs(); } saveFile.createNewFile(); // 轉(zhuǎn)移到FTP服務(wù)器目錄 ftpClient.changeWorkingDirectory(path); output = new FileOutputStream(saveFile); ftpClient.retrieveFile(filePath, output); } catch (IOException e) { LOGGER.debug("文件:" + filePath + "______________________下載失敗!"); e.printStackTrace(); } finally { LOGGER.debug("文件:" + filePath + "______________________下載成功!"); IOUtils.closeQuietly(output); } } @Override public List<String> listRemoteFilePath(String path) { List<String> list = new ArrayList<String>(); try { if (!StringUtils.endsWith(path, "/") && !StringUtils.endsWith(path, File.separator)) { if (Commander.isLinux) { path = path + File.separator; } else { path = path + "/"; } } boolean changedir = ftpClient.changeWorkingDirectory(path); if (changedir) { ftpClient.setControlEncoding(encoding); FTPFile[] files = ftpClient.listFiles(); for (FTPFile file : files) { if (list.size() >= max) { break; } if (file.isDirectory()) { if (!StringUtils.endsWith(path, "/") && !StringUtils.endsWith(path, File.separator)) { if (Commander.isLinux) { path = path + File.separator; } else { path = path + "/"; } } list.addAll(this.listRemoteFilePath(path + file.getName())); } else if (changedir) { if (!StringUtils.endsWith(path, "/") && !StringUtils.endsWith(path, File.separator)) { if (Commander.isLinux) { path = path + File.separator; } else { path = path + "/"; } } File saveFile = new File(path + file.getName()); if (!saveFile.exists()) { list.add(path + file.getName()); } } } } } catch (Exception e) { e.printStackTrace(); } return list; } @Override public void closeConnection() { if (ftpClient != null) { try { ftpClient.logout(); } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } } } } [java] view plain copy package com.eastrobot.remote; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.Vector; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.eastrobot.command.Commander; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpATTRS; import com.jcraft.jsch.SftpException; import com.jcraft.jsch.ChannelSftp.LsEntry; public class FileSftpRemote extends FileRemote { protected Session session = null; protected ChannelSftp channel = null; private final static Log LOGGER = LogFactory.getLog(FileSftpRemote.class); @Override public void initFtpInfo(String host, String port, String username, String password) { try { JSch jsch = new JSch(); // 創(chuàng)建JSch對象 session = jsch.getSession(username, host, StringUtils.isNotBlank(port) ? Integer.valueOf(port) : 22); session.setPassword(password); // 設(shè)置密碼 Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); // 為Session對象設(shè)置properties session.setTimeout(60000); // 設(shè)置timeout時(shí)間 session.connect(); // 通過Session建立鏈接 Channel chan = session.openChannel("sftp"); // 打開SFTP通道 chan.connect(); // 建立SFTP通道的連接 channel = (ChannelSftp) chan; } catch (Exception e) { LOGGER.error("sftp連接失敗"); e.printStackTrace(); } } @Override public void downloadRemoteFile(String filePath) { if (StringUtils.endsWith(filePath, "/") || StringUtils.endsWith(filePath, File.separator)) { filePath = filePath.substring(0, filePath.length() - 1); } File saveFile = new File(filePath); FileOutputStream output = null; try { if (saveFile.exists()) { return; } // 創(chuàng)建目標(biāo)文件路徑 if (!saveFile.getParentFile().exists()) { saveFile.getParentFile().mkdirs(); } saveFile.createNewFile(); // 文件所在目錄 String path = filePath.substring(0, filePath.lastIndexOf("/")); if (!StringUtils.endsWith(path, "/") && !StringUtils.endsWith(path, File.separator)) { if (Commander.isLinux) { path = path + File.separator; } else { path = path + "/"; } } channel.cd(path); channel.get(filePath, new FileOutputStream(saveFile)); LOGGER.debug("文件:" + filePath + "____________________________________________下載成功!"); } catch (Exception e) { LOGGER.debug("文件:" + filePath + "____________________________________________下載失敗!"); e.printStackTrace(); } finally { IOUtils.closeQuietly(output); } } @SuppressWarnings("unchecked") @Override public List<String> listRemoteFilePath(String path) { List<String> list = new ArrayList<String>(); Vector<LsEntry> v = null; try { if (!StringUtils.endsWith(path, "/") && StringUtils.endsWith(path, File.separator)) { path = path + File.separator; } v = channel.ls(path); } catch (SftpException e) { e.printStackTrace(); } for (LsEntry lsEntry : v) { if (list.size() >= max) { break; } if (!".".equals(lsEntry.getFilename()) && !"..".equals(lsEntry.getFilename())) { SftpATTRS attrs = lsEntry.getAttrs(); if (attrs.isDir()) { if (!StringUtils.endsWith(path, "/") && !StringUtils.endsWith(path, File.separator)) { if (Commander.isLinux) { path = path + File.separator; } else { path = path + "/"; } } list.addAll(this.listRemoteFilePath(path + lsEntry.getFilename())); } else { if (!StringUtils.endsWith(path, "/") && !StringUtils.endsWith(path, File.separator)) { if (Commander.isLinux) { path = path + File.separator; } else { path = path + "/"; } } File saveFile = new File(path + lsEntry.getFilename()); if (!saveFile.exists()) { list.add(path + lsEntry.getFilename()); } } } } return list; } @Override public void closeConnection() { try { if (channel != null) { channel.quit(); channel.disconnect(); } if (session != null) { session.disconnect(); } } catch (Exception e) { e.printStackTrace(); } } public Session getSession() { return session; } public void setSession(Session session) { this.session = session; } public ChannelSftp getChannel() { return channel; } public void setChannel(ChannelSftp channel) { this.channel = channel; } }
以上所述是小編給大家介紹的sftp和ftp 根據(jù)配置遠(yuǎn)程服務(wù)器地址下載文件到當(dāng)前服務(wù),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
如何通過自定義spring?invalidator注解校驗(yàn)數(shù)據(jù)合法性
這篇文章主要介紹了如何通過自定義spring?invalidator注解校驗(yàn)數(shù)據(jù)合法性,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07如何將java或javaweb項(xiàng)目打包為jar包或war包
本文主要介紹了如何將java或javaweb項(xiàng)目打包為jar包或war包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法詳解
在現(xiàn)在的日常開發(fā)中不管前端還是后端,JSON 格式的數(shù)據(jù)是用得比較多的,甚至可以說無處不在,這篇文章主要給大家介紹了關(guān)于Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法,需要的朋友可以參考下2023-12-12Spring?Boot實(shí)現(xiàn)JWT?token自動續(xù)期的實(shí)現(xiàn)
本文主要介紹了Spring?Boot實(shí)現(xiàn)JWT?token自動續(xù)期,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Java實(shí)現(xiàn)調(diào)用ElasticSearch?API的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java調(diào)用ElasticSearch?API的效果資料,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的可以了解一下2023-03-03詳解java中反射機(jī)制(含數(shù)組參數(shù))
這篇文章主要介紹了詳解java中反射機(jī)制(含數(shù)組參數(shù))的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10詳解Spring Boot微服務(wù)如何集成fescar解決分布式事務(wù)問題
這篇文章主要介紹了詳解Spring Boot微服務(wù)如何集成fescar解決分布式事務(wù)問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01