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

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

 

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索远程ftp服务器
sftp服务器
远程ftp服务器、远程访问ftp服务器、ftp连接远程服务器、ftp远程服务器下载、ftp 命令 远程服务器,以便于您获取更多的相关知识。

时间: 2024-10-25 14:51:26

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

window系统cmd环境下从远程FTP服务器上下载文件

  我们总会遇到这样或那样的问题,window系统cmd环境下从远程FTP服务器上下载文件是怎么实现的呢? 看看下面的方法,也许对你有帮助: @echo off rem 指定FTP用户名 set ftpUser=FTPUSERYGL rem 指定FTP密码 set ftpPass=FTPUSER rem 指定FTP服务器地址 set ftpIP=10.16.12.101 rem 指定待下载的文件位于FTP服务器的哪个目录 set ftpFolder=/MBX-YGL-IN/UE0620/MBX-

在vCenter中配置邮件服务器地址

当VMware vCenter云管理平台出现警告时,您的邮箱就自动接收到警告件事,是否会让您觉得安全和便利了? 下面我们在局域网的环境中来配置一台邮件服务器,建立一个收件账户,在vCenter中配置邮件服务器地址,设置触发规则,具体步骤如下 1. 新建一台windows server 2003 enterprise虚拟机,在服务器管理中选择配置邮件服务器,如图1-1所示. 图1-1 配置邮件服务器 2. 在POP3服务中添加邮箱账户,如图1-2所示. 图1-2 添加邮箱 3. 在SMTP虚拟服务

从ftp服务器上下载文件

ftp服务器|下载 <?php/** * 函数名 php_ftp_download * 功能   从ftp服务器上下载文件 * 入口参数 * filename 欲下载的文件名,含路径 */function php_ftp_download($filename) {  $phpftp_host = "ftplocalhost";    // 服务器地址  $phpftp_port = 21;            // 服务器端口  $phpftp_user = "nam

imp-在securecrt中向远程服务器导入dmp文件

问题描述 在securecrt中向远程服务器导入dmp文件 出现错误udi12170 operation generated Oracle error 12170 ora~12170 tns 连接超时 请问怎么解决

asp.net-从服务器上下载文件到本地不成功

问题描述 从服务器上下载文件到本地不成功 当项目在本地时正常,当项目布在服务器上面,下载的文件存储在服务器上.代码如下,怎么才能让文件保存在本地 Uri downUri = new Uri(@"http://wap.incake.net/voiceorderFile/NO7HhefxdIeQqzvbfw7EP8_U1Up3Vdzw0YfQ5vB_oaMQoZq4bfa5P-T-SqixZtXP8LK.mp3"); //建立一个WEB请求,返回HttpWebRequest对象 HttpW

c#下面用progressBar控件显示从服务器上面下载文件进度的问题

问题描述 小弟是使用下面这个函数从服务器上面下载文件的,现在想用C#下面的progressBar控件显示下载进度,请各位大侠指点一下,应该怎么使用这个控件的max.min和step应该怎样设置还有语句应该放在什么地方跪谢了!!!publicstaticbooldownloadFile(stringstrFileName,stringfile){boolflag=false;//打开上次下载的文件longSPosition=0;//实例化流对象FileStreamFStream;//判断要下载的文

利用scp备份远程服务器上的文件到本地

当远程服务器上的图片需要备份时候,我们可以利用Linux的scp命令进行远程拷贝到本地. 先简单介绍一下scp的用法: 语法格式: scp [OPTIONS] file_source file_target OPTIONS: -v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接.认证. 或是配置错误 -C 使能压缩选项 -P 选择端口 . 注意 -p 已经被 rcp 使用 -r 递归下面所有文件 example: 从 本地/home/test.log 复制

如何通过IE从FTP服务器上下载文件

  在windows xp系统自带的IE浏览器中内置/FTP功能,通过它,即便在没有FTP工具的情况下,也可以轻松地从FTP服务器上下载资料.不过在使用1E浏览器从FTP服务器上下载资料前,还需要作以下设咒. 第1步:启动InternetExplorer浏览器,在菜单栏单击"工具"-"Internet选项"命令,打开"Internet选项"对话框. 第2步:切换到"高级"选项卡,拖动右边的滾动条,在窗口中找到"浏览&

php实现从ftp服务器上下载文件树到本地电脑的程序_php技巧

复制代码 代码如下: /* 用ftp_nlist()函授时,返回的数组值会有两种类型:因服务器不同而异 a:单独的文件名 b:包含目录的文件名. 如果挪用,请注意更改此处. */ <?php function download_file($dir,$fc,$_FILE_) { $fn=ftp_nlist($fc,".");//列出该目录的文件名(含子目录),存储在数组中 $size=sizeof($fn); $dir=($dir=="")?$dir:('/'.