设为首页 收藏本站
查看: 1331|回复: 0

[经验分享] edtFtp实现FTP工具类

[复制链接]

尚未签到

发表于 2016-6-8 08:19:21 | 显示全部楼层 |阅读模式
  edtFtp是一个开源的纯Java的FTP客户端类库。由于它实现了FTP协议,程序员可以通过它对远程FTP服务器进行访问,而不用再手工编写各种命令和处理服务器的回应。下面是我在实现开发中实现的一个FTP操作类,将其记录在此,方便以后使用。源代码如下:
  


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.enterprisedt.net.ftp.FTPException;
import com.enterprisedt.net.ftp.FTPFile;
import com.enterprisedt.net.ftp.FileTransferClient;
import com.enterprisedt.net.ftp.FileTransferOutputStream;

/**
* FTP服务器操作工具类
*
* @author XXX
*
*/
public class FtpService
{
private static final Log logger = LogFactory.getLog(FtpService.class
.getName());
// 部分静态常量
private static final String SYSTEM_CONFIG_ITEM_FTPIP = "ip";
private static final String SYSTEM_CONFIG_ITEM_FTPPORT = "port";
private static final String SYSTEM_CONFIG_ITEM_FTPLOGINNAME = "username";
private static final String SYSTEM_CONFIG_ITEM_FTPLOGINPWD = "password";
private static final String SYSTEM_CONFIG_ITEM_PARAM_TYPE = "marketingActiveFtpParam";
// FTP服务器IP地址
private String ftpServiceIP;
// FTP服务器端口
private int ftpServicePort;
// 登录账号
private String loginUser;
// 登录密码
private String loginPwd;
// FTP客户端对象
private FileTransferClient ftpClient = null;
// 单例对象
private static FtpService ftpService = null;
/**
* 获取单例对象方法
*
* @return
* @throws Exception
*/
public static synchronized FtpService getInstance() throws Exception
{
try
{
if (ftpService == null)
{
logger.info("从数据库获取FTP服务器相关配置,创建FTP客户端");
String ftpServiceIP = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPIP);
int ftpServicePort = Integer.parseInt(SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPPORT));
String loginUser = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPLOGINNAME);
String loginPwd = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPLOGINPWD);
ftpService = new FtpService(ftpServiceIP, ftpServicePort, loginUser, loginPwd);
}
}
catch (Exception e)
{
throw new Exception("获取FTP服务器实例时异常,FTP服务器配置错误,请检查" + e);
}
return ftpService;
}
/**
* 为了系统参数修改后,能创建新的Ftp客户端对象,特增加了此方法
*
* @return
* @throws Exception
*/
public static synchronized FtpService getInstance(boolean isNew) throws Exception
{
try
{
if(isNew)
{
logger.info("从数据库获取FTP服务器相关配置,创建FTP客户端");
String ftpServiceIP = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPIP);
int ftpServicePort = Integer.parseInt(SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPPORT));
String loginUser = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPLOGINNAME);
String loginPwd = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPLOGINPWD);
ftpService = new FtpService(ftpServiceIP, ftpServicePort, loginUser, loginPwd);
}
else
getInstance();
}
catch (Exception e)
{
throw new Exception("获取FTP服务器实例时异常,FTP服务器配置错误,请检查" + e);
}
return ftpService;
}
/**
* 获取指定路径下指定目录或文件名称列表
*
* @param dir:指定路径
* @param directoryName:指定的目录名称,全称或部分
* @return:名称列表
*/
public synchronized List<String> getDirectoryListByDir(String dir,
String directoryName) throws Exception
{
logger
.info(String.format("从FTP服务上获取指定路径下的目录或文件名称列表,路径[%s],目录或文件名称[%s]。",
dir, directoryName));
List<String> allDirectorys = null;
try
{
ftpClient.changeDirectory(dir);
FTPFile[] files = ftpClient.directoryList(directoryName.trim());
int length = files.length;
if (length > 0)
{
allDirectorys = new ArrayList<String>();
for (int i = 0; i < length; i++)
{
allDirectorys.add(files.getName().trim());
}
}
changeToRootDirectoryByDir(dir);
}
catch (Exception e)
{
throw new Exception("获取指定路径下指定目录名称列表时发生异常,原因:" + e);
}
return allDirectorys;
}
/**
* 将FTP服务器指定目录下的指定文件下载到本地指定的文件中并将FTP上的文件删除掉
*
* @param dir:FTP服务器上目录
* @param localFileName:存放到本地的文件名称(包含存放的路径,如无路径则默认为当前路径)
* @param remoteFileName:FTP服务器上的文件名称
*/
public synchronized void downloadRemoteFileToLocalAndDeleteIt(String dir,
String localTempProcessFileName, String localBackupFileName,
String remoteFileName) throws Exception
{
logger
.info(String
.format(
"将FTP服务器指定目录下的指定文件下载到本地指定的文件中并将FTP上的文件删除掉,FTP服务器目录[%s],远程文件名[%s],本地文件名[%s]。",
dir, remoteFileName, localTempProcessFileName));
try
{
ftpClient.changeDirectory(dir);
boolean isExists = ftpClient.exists(remoteFileName);
if (!isExists)
{
logger.info(remoteFileName + "文件在FTP服务器目录" + dir
+ "不存在,请检查FTP服务器");
return;
}
ftpClient.downloadFile(localTempProcessFileName, remoteFileName);
logger.info("已将FTP服务器上的文件" + remoteFileName + "下载到本地文件"
+ localTempProcessFileName);
ftpClient.downloadFile(localBackupFileName, remoteFileName);
ftpClient.deleteFile(remoteFileName);
logger.info("已将FTP服务器上的文件" + remoteFileName + "删除");
changeToRootDirectoryByDir(dir);
}
catch (Exception e)
{
throw new Exception("将FTP服务器指定目录下的指定文件下载到本地指定的文件时发生异常,原因:" + e);
}
}
/**
* 将FTP服务器上的文件下载到本地
*
* @param remoteFileName
* @param localFileName
* @throws Exception
*/
public synchronized boolean downloadRemotFileToLocal(String remoteFileName,
String localFileName) throws Exception
{
logger.info(String.format("将FTP服务器上的文件下载到本地,远程文件名[%s],本地文件名[%s]。",
remoteFileName, localFileName));
String msg = "";
try
{
// connectToServer();
boolean isExists = ftpClient.exists(remoteFileName);
if (!isExists)
{
msg = remoteFileName + "文件在FTP服务器上不存在,请检查FTP服务器";
logger.info(msg);
throw new RuntimeException(msg);
}
ftpClient.downloadFile(localFileName, remoteFileName);
logger.info("已将FTP服务器上的文件" + remoteFileName + "下载到本地文件"
+ localFileName);
}
catch (RuntimeException e)
{
msg = "将FTP服务器上文件下载到本地时发生异常,原因:" + e.getMessage();
logger.info(msg);
throw new RuntimeException(msg);
}
return true;
}
/**
* 将指定的本地文件上传到FTP服务器上
*
* @param localFileName
* @param remoteFileName
*/
public synchronized void uploadFileToFtpServer(String localFileName,
String remoteFileName) throws Exception
{
logger.info(String.format("将指定的本地文件上传到FTP服务器上,本地文件名[%s],远程文件名[%s]。",
localFileName, remoteFileName));
try
{
ftpClient.uploadFile(localFileName, remoteFileName);
logger.info("成功将文件" + localFileName + "上传到FTP服务器");
}
catch (Exception e)
{
throw new Exception("将指定的本地文件上传到FTP服务器上时发生异常,原因:" + e);
}
}
/**
* 将内容串上传到FTP服务器
*
* @param remoteFileName
* @param allContents
* @throws Exception
*/
public synchronized void uploadContentsToFtpServer(String remoteFileName,
String allContents) throws Exception
{
logger.info(String.format("将内容串上传到FTP服务器上指定的文件中,远程文件名[%s],内容串[%s]。",
remoteFileName, allContents));
FileTransferOutputStream outputStream = null;
try
{
outputStream = ftpClient.uploadStream(remoteFileName);
outputStream.write(allContents.getBytes());
outputStream.flush();
logger.info("成功将文件" + remoteFileName + "上传到FTP服务器");
}
catch (Exception e)
{
throw new Exception("将内容上传到FTP服务器上时发生异常,原因:" + e);
}
finally
{
if (outputStream != null)
{
outputStream.close();
outputStream = null;
}
}
}
/**
* 根据传入的目录路径返回到FTP服务器根目录,供下次使用
*
* @param dir
* @throws FTPException
* @throws IOException
*/
private synchronized void changeToRootDirectoryByDir(String dir)
throws FTPException, IOException
{
logger
.info(String.format("根据传入的目录路径返回到FTP服务器根目录,供下次使用,当前路径[%s]。", dir));
int parentLevels = dir.split("/").length;
for (int i = 0; i < parentLevels; i++)
ftpClient.changeToParentDirectory();
}
/**
* 连接FTP服务器,并登录服务器
*
* @throws FTPException
* @throws IOException
*/
public synchronized void connectToServer() throws Exception
{
ftpClient = new FileTransferClient();
try
{
ftpClient.setRemoteHost(ftpServiceIP);
ftpClient.setRemotePort(ftpServicePort);
ftpClient.setUserName(loginUser);
ftpClient.setPassword(loginPwd);
ftpClient.connect();
logger.info(String.format("连接并登录到FTP服务器,IP[%s],Port[%d],User[%s]。",
ftpServiceIP, ftpServicePort, loginUser));
}
catch (Exception e)
{
ftpService = null;
throw new Exception("连接和登录FTP服务器时发生异常,请检查FTP服务器参数配置,原因:" + e);
}
}
/**
* 断开与FTP服务器的连接
*
* @throws FTPException
* @throws IOException
*/
public synchronized void disconnectToServer() throws Exception
{
try
{
if (ftpClient != null)
{
if (ftpClient.isConnected())
{
ftpClient.disconnect();
ftpClient = null;
logger.info("断开与FTP服务器连接");
}
}
}
catch (Exception e)
{
throw new Exception("断开与FTP服务器连接时发生异常,原因:" + e);
}
}
/**
* 无参私有构造器
*/
private FtpService()
{
super();
}
/**
* 全参私有构造器
*
* @param ftpServiceIP
* @param ftpServicePort
* @param loginUser
* @param loginPwd
*/
private FtpService(String ftpServiceIP, int ftpServicePort,
String loginUser, String loginPwd)
{
super();
this.ftpServiceIP = ftpServiceIP;
this.ftpServicePort = ftpServicePort;
this.loginUser = loginUser;
this.loginPwd = loginPwd;
}
}

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-227601-1-1.html 上篇帖子: ftp replycode summary 下篇帖子: 定时上传FTP文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表