sftp和ftp 根据配置远程服务器地址下载文件到当前服务

 更新时间:2016年10月26日 14:26:09   作者:zhangqinfu  
这篇文章主要介绍了sftp和ftp 根据配置远程服务器地址下载文件到当前服务的相关资料本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下

废话不多说,关键代码如下所示:

 

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 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 { 
// 构造一个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 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(); // 创建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 根据配置远程服务器地址下载文件到当前服务,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • SpringBoot内置tomcat启动原理详解

    SpringBoot内置tomcat启动原理详解

    这篇文章主要介绍了SpringBoot内置tomcat启动原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • MyBatis中的properties配置(推荐)

    MyBatis中的properties配置(推荐)

    这篇文章给大家介绍了MyBatis中的properties配置,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-12-12
  • Java实现二分查找的变种

    Java实现二分查找的变种

    这篇文章主要为大家详细介绍了Java实现二分查找的变种,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Java 中Object的wait() notify() notifyAll()方法使用

    Java 中Object的wait() notify() notifyAll()方法使用

    这篇文章主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java编写网上超市购物结算功能程序

    Java编写网上超市购物结算功能程序

    这篇文章主要为大家详细介绍了Java编写网上超市购物结算功能程序的具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 关于idea中Java Web项目的访问路径问题

    关于idea中Java Web项目的访问路径问题

    这篇文章主要介绍了idea中Java Web项目的访问路径问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java批量导入导出文件的实例分享(兼容xls,xlsx)

    java批量导入导出文件的实例分享(兼容xls,xlsx)

    这篇文章主要给大家介绍了利用java批量导入导出文件的相关资料,文中给出了详细的实例代码,并且兼容xls,xlsx,对大家具有一定的参考学习价值,下面跟着小编一起来看看详细的介绍吧。
    2017-06-06
  • java swing中实现拖拽功能示例

    java swing中实现拖拽功能示例

    这篇文章主要介绍了java swing中实现拖拽功能示例,需要的朋友可以参考下
    2014-04-04
  • 在IDEA中创建跑得起来的Springboot项目

    在IDEA中创建跑得起来的Springboot项目

    这篇文章主要介绍了在IDEA中创建跑得起来的Springboot项目的图文教程,需要的朋友可以参考下
    2018-04-04
  • Java常见基础数据结构

    Java常见基础数据结构

    这篇文章主要介绍了Java常见数据结构面试题,带有答案及解释,希望对广大的程序爱好者有所帮助,同时祝大家有一个好成绩,需要的朋友可以参考下,希望可以帮助到你
    2021-07-07

最新评论