国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

sftp和ftp 根據配置遠程服務器地址下載文件到當前服務

2019-11-26 13:39:27
字體:
來源:轉載
供稿:網友

廢話不多說,關鍵代碼如下所示:

 

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; } /** * 執行定時任務 */ public void process() { LOGGER.debug("----------------------------------------進入定時下載遠程文件"); // 創建線程池 ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(new Runnable() { @Override public void run() { // 建立連接 initFtpInfo(host, port, username, password); // 遠程服務所有源文件路徑集合 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); /** * 下載遠程服務下文件到本地服務 * * @param path * @return * @throws Exception */ public abstract void downloadRemoteFile(String filePath); /** * 獲取遠程服務下指定目錄下的所有文件路徑集合(包含子目錄下文件) * * @param path * @return */ public abstract List<String> listRemoteFilePath(String path); /** * 釋放連接 */ public abstract void closeConnection(); } [java] view plain copypackage 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 { // 構造一個FtpClient實例 ftpClient = new FTPClient(); // 設置字符集 ftpClient.setControlEncoding(encoding); // 連接FTP服務器 ftpClient.connect(host, StringUtils.isNotBlank(port) ? Integer.valueOf(port) : 21); // 連接后檢測返回碼來校驗連接是否成功 int reply = ftpClient.getReplyCode(); if (FTPReply.isPositiveCompletion(reply)) { // 登陸到ftp服務器 if (ftpClient.login(username, password)) { setFileType(); } ftpClient.login(username, password); } else { ftpClient.disconnect(); LOGGER.error("ftp服務拒絕連接!"); } } catch (Exception e) { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); // 斷開連接 } catch (IOException e1) { LOGGER.error("ftp服務連接斷開失敗!"); } } LOGGER.error("ftp服務連接失敗!"); } } /** * 設置文件傳輸類型 */ 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 { // 創建目標文件路徑 if (!saveFile.getParentFile().exists()) { saveFile.getParentFile().mkdirs(); } saveFile.createNewFile(); // 轉移到FTP服務器目錄 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 copypackage 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(); // 創建JSch對象 session = jsch.getSession(username, host, StringUtils.isNotBlank(port) ? Integer.valueOf(port) : 22); session.setPassword(password); // 設置密碼 Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); // 為Session對象設置properties session.setTimeout(60000); // 設置timeout時間 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; } // 創建目標文件路徑 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 根據配置遠程服務器地址下載文件到當前服務,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嵩明县| 涿鹿县| 诸城市| 闵行区| 虹口区| 庆元县| 湾仔区| 乌兰浩特市| 香格里拉县| 梨树县| 吴桥县| 宣化县| 台北县| 永靖县| 蒲江县| 平南县| 清流县| 延庆县| 广平县| 名山县| 黄骅市| 云安县| 甘孜| 海阳市| 晋宁县| 襄汾县| 双牌县| 杭锦后旗| 雷波县| 凤庆县| 陇川县| 营山县| 汝城县| 会昌县| 鹿邑县| 明溪县| 临洮县| 定陶县| 黑河市| 平利县| 莱西市|