java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > sftp和ftp 配置远程服务器

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

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

您可能感兴趣的文章:
阅读全文