您的位置:首页 > 编程语言 > PHP开发

教大家用FTPClient对ftp文件进行上传下载等操作

2013-03-08 16:20 716 查看
package com.ad.util;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPListParseEngine;

import com.ad.adweb.system.GlobalConst;

import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.File;
import java.util.Calendar;

/**
* <p>
* Title: FTPUtil
* </p>
* <p>
* Description: FTP操作的工具类,通过此类可以完成文件到指定FTP服务器的上传和下载。
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: Routon
* </p>
*
* @author zhihui zhou
* @version 1.0 InternalError-->Exception by jiangyl
* @2007.12.21
*/
public class FTPUtil
{

/**
* 全局配置项: ftp传输模式: passive/active
*/
//private static String	ConfigFtpMode = null;

/**
* 全局配置项: applet ftp传输模式: passive/active
*/
//private static String	ConfigClientFtpMode	= null;

/**
* ftp服务器的ip地址
*/
private String				_ftpServer;

/**
* ftp端口
*/
private int						_ftpPort;

//
/**
* ftp服务器的有效登陆用户名
*/
private String				_userName;

/**
* ftp服务器的有效登陆用户密码
*/
private String				_password;

/**
* ftp客户端的对象实例
*/
private FTPClient			_ftp;

/**
* ftp mode
*/
private String				FtpMode = null;

// public FTPUtil(String ftpServer, String userName, String password) throws Exception
// {
// try
// {
// setFTPServer(ftpServer);
// setUserName(userName);
// setPassword(password);
//
// // 初始化ftp客户端对象实例
// _ftp = new FTPClient();
// }
// catch (Exception ex)
// {
// throw new Exception(ex.getMessage());
// }
// }
/**
* 构造器
*
* @param ftpServer FTP服务器
*          String
* @param userName 用户名
*          String
* @param password 密码
*          String
* @throws Exception 异常
*/
public FTPUtil(String ftpServer, int port, String userName, String password) throws Exception
{
try
{
setFTPServer(ftpServer);
setUserName(userName);
setPassword(password);
this._ftpPort = port;

// 初始化ftp客户端对象实例
_ftp = new FTPClient();
}
catch (Exception ex)
{
throw new Exception(ex.getMessage());
}
}

/**
* 获取ftp服务器的ip地址
*
* @return ftpServerIP String
*/
public String getFTPServer()
{
return _ftpServer;
}

/**
* 设置ftp服务器的ip地址
*
* @param ftpServerIP
*          String
* @throws Exception
*/
public void setFTPServer(String ftpServer) throws Exception
{
// 检查输入的ftp服务器地址,不允许为空。
if (ftpServer == null || ftpServer.length() == 0)
{
throw new Exception("ftp服务器的IP地址不能够为空。");
}

_ftpServer = ftpServer;
}

/**
* 获取ftp服务器的用户名
*
* @return userName String
*/
public String getUserName()
{
return _userName;
}

/**
* 设置ftp服务器的用户名
*
* @param userName
*          String
* @throws Exception
*/
public void setUserName(String userName) throws Exception
{
// 检查输入的ftp服务器名称,不允许为空。
if (userName == null || userName.length() == 0)
{
throw new Exception("ftp服务器的登陆用户名不能够为空。");
}

_userName = userName;
}

/**
* 获取ftp服务器的用户登陆密码
*
* @return password String
*/
public String getPassword()
{
return _password;
}

/**
* 设置ftp服务器的用户密码
*
* @param password
*          String
* @throws Exception
*/
public void setPassword(String password) throws Exception
{
// 检查输入的ftp服务器用户登陆密码,不允许为空。
if (password == null || password.length() == 0)
{
throw new Exception("ftp服务器的登陆用户密码不能够为空。");
}

_password = password;
}

/**
* 上传文件到ftp服务器的指定路径
*
* @param ftpPath
*          文件上传到ftp的路径
* @param inputStream
*          待上传的文件流
* @return isUploadSuccessed ture表示上传成功,发了社表明上传失败。
* @throws Exception
*/
public boolean UploadFile(String ftpPath, InputStream inputSteam) throws Exception
{
boolean isSuccessed = false;

// 通过指定的用户名和密码登陆ftp服务器
try
{
if (Login(_userName, _password))
{
// 开始上传文件
_ftp.setFileType(FTP.BINARY_FILE_TYPE);

if (_ftp.storeFile(ftpPath, inputSteam))
{
isSuccessed = true;
}
else
{
throw new Exception("文件上传失败!");
}
}
else
{
// 登陆失败
isSuccessed = false;
throw new Exception("用户" + _userName + "登陆ftp服务器" + _password + "失败。");
}
}
catch (Exception ex)
{
throw new Exception(ex.getMessage());
}
finally
{
ftpDispose();
}

return isSuccessed;
}

/**
* 在ftp服务器上面创建一个目录
*
* @param folderName
*          目录名称
* @return boolean 创建结果true表示成功,false表示失败
* @throws Exception
*/
public boolean CreateFolder(String folderName) throws Exception
{
boolean isSuccessed = false;

// 通过指定的用户名和密码登陆ftp服务器
try
{
if (Login(_userName, _password))
{
// 开始创建指定的目录到ftp服务器上
if (_ftp.makeDirectory(folderName))
{
isSuccessed = true;
}
else
{
throw new Exception("ftp文件夹创建失败!");
}
}
else
{
// 登陆ftp失败
isSuccessed = false;
throw new Exception("用户" + _userName + "登陆ftp服务器" + _password + "失败。");
}
}
catch (Exception ex)
{
throw new Exception(ex.getMessage());
}
finally
{
ftpDispose();
}

return isSuccessed;
}

/**
* 根据指定的用户名和密码登陆ftp服务器
*
* @param username
*          登陆用户名
* @param password
*          登陆用户密码
* @return isUploadSuccessed true表示登陆成功,false表示登陆失败
* @throws Exception
*/
public boolean Login(String username, String password) throws Exception
{
boolean isSuccessed = false;

try
{
int reply = 0;

// 连接到指定的ftp服务器
_ftp.connect(_ftpServer, this._ftpPort);

// 检查ftp连接请求的响应码,确保本次连接请求是成功还是失败。
reply = _ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply))
{
_ftp.disconnect();
throw new Exception("FTP服务器拒绝了连接.");
}

// 根据指定的用户名和密码登陆ftp服务器
if (!_ftp.login(_userName, _password))
{
throw new Exception("用户" + _userName + "登陆ftp服务器" + _password + "失败。");
}

// set ftp mode
setCurrentFtpMode();

isSuccessed = true;
}
catch (Exception e)
{
throw new Exception(e.getMessage());
}

return isSuccessed;
}

/**
* 设置ftp模式,优先顺序: 1. FtpMode 2. ConfigFtpMode 3. commons-net lib 默认
*/
private void setCurrentFtpMode()
{
String tmpFtpMode = null;
if (FtpMode != null && FtpMode.length() > 0)
{
tmpFtpMode = FtpMode;
}
else if (GlobalConst.ConfigFtpMode != null && GlobalConst.ConfigFtpMode.length() > 0)
{
tmpFtpMode = GlobalConst.ConfigFtpMode;
}

if (tmpFtpMode != null && tmpFtpMode.length() > 0)
{
if (tmpFtpMode.equalsIgnoreCase("passive"))
{
_ftp.enterLocalPassiveMode();
}
else if (tmpFtpMode.equalsIgnoreCase("active"))
{
_ftp.enterLocalActiveMode();
}
}
}

/**
* 释放ftp客户端
*/
public void ftpDispose()
{
try
{
// 注销FTP客户端
_ftp.logout();
}
catch (Exception e)
{
// 如果FTP注销失败什么也不做,忽略掉异常。
}

// 如果FTP客户端的连接还存在则断开连接。
if (_ftp.isConnected())
{
try
{
_ftp.disconnect();
}
catch (Exception ex)
{
// 如果断开FTP连接失败什么也不做,忽略掉异常。
}
}
}

/**
* 从ftp下载文件
*
* @param FtpFileName
*          来源文件名称
* @param LocaFileName
*          目的文件名称
* @return boolean true表示下载文件成功,false表示下载文件失败
* @throws Exception
*/
public boolean DownFile(String FtpFileName, String LocaFileName) throws Exception
{
boolean isSuccessed = false;

try
{
if (Login(_userName, _password))
{
File file = new File(LocaFileName);
FileOutputStream fos = new FileOutputStream(file);

// + by jiangyl @2008.7.6
_ftp.setFileType(FTP.BINARY_FILE_TYPE);

isSuccessed = _ftp.retrieveFile(FtpFileName, fos);
fos.close();
file = null;

if (!isSuccessed)
{
throw new Exception("文件" + FtpFileName + "下载失败.");
}
}
else
{
isSuccessed = false;
throw new Exception("用户" + _userName + "登陆ftp服务器" + _password + "失败。");
}
}
catch (Exception ex)
{
throw new Exception(ex.getMessage());
}
finally
{
ftpDispose();
}

return isSuccessed;
}

/**
* 提供一静态方法,由外部定时任务模块调用,对FTP服务器上的过期数据文件进行清理
*
* @return int 表示成功删除文件的个数
* @throws Exception
*/
public static void ClearFTPExpiredFiles() throws Exception
{
com.ad.util.FtpServerInfo ftpServer = com.ad.util.FtpServerInfo.getInstance();
com.ad.util.FTPUtil ftpUtil = new com.ad.util.FTPUtil(ftpServer.getFtp().getFtpIntIP(),
ftpServer.getFtp().getPort(), ftpServer.getFtp().getUpName(), ftpServer.getFtp().getUpPWD());

ftpUtil.ClearExpiredFiles();
}

/**
* 根据web.xml中配置, 对FTP服务器上的过期数据文件进行清理,清理的目录有:playbill、terParam、theme、ThemePolicy
*
* @return int 表示成功删除文件的个数
* @throws Exception
*/
public int ClearExpiredFiles() throws Exception
{

int deleteNum = 0;

try
{
if (Login(_userName, _password))
{
deleteNum += DeleteExpiredFiles("playbill");
deleteNum += DeleteExpiredFiles("terParam");
deleteNum += DeleteExpiredFiles("theme");
deleteNum += DeleteExpiredFiles("ThemePolicy");
}
else
{

throw new Exception("用户" + _userName + "登陆ftp服务器" + _password + "失败。");
}
}
catch (Exception ex)
{
throw new Exception(ex.getMessage());
}
finally
{
ftpDispose();
}

return deleteNum;
}

/**
* 根据web.xml中配置, 对FTP服务器上的过期数据文件进行清理
*
* @param FtpPathName
*          待清理的目录
* @return int 表示成功删除文件的个数
* @throws Exception
*/
private int DeleteExpiredFiles(String FtpPathName) throws Exception
{
boolean isSuccessed = false;
int deleteNum = 0;
Calendar dtNow = Calendar.getInstance();
Calendar dt = null;
FTPFile[] files = null;
long t1 = System.currentTimeMillis();
long t2 = -1;

try
{
// _ftp.changeWorkingDirectory("ThemePolicy");
// String[] names = _ftp.listNames();

// Paged access, using a parser accessible by auto-detect:
FTPListParseEngine engine = _ftp.initiateListParsing(FtpPathName);

while (engine.hasNext())
{
files = engine.getNext(25); // "page size" you want

for (int i = 0; i < files.length; i++)
{
// System.out.println(files[i].getName()+" -- "+FastDateFormat.getInstance("yyyy-MM-dd
// HH:mm:ss").format(files[i].getTimestamp()));
dt = files[i].getTimestamp();
dt.add(Calendar.MONTH, com.ad.adweb.system.ClearExpiredDataDao.ExpiredDataMonthDiff);
// FTP服务器中保留最近多少个月的数据,默认为1个月
if (dt.compareTo(dtNow) <= 0)
{
isSuccessed = _ftp.deleteFile(FtpPathName + "/" + files[i].getName());

if (isSuccessed)
{
deleteNum++;
//System.out.println("deleteFile OK! -- " + files[i].getName() + " -- " + FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss").format(dt));
}

}
}// for
}

}
catch (Exception ex)
{
throw new Exception(ex.getMessage());
}

t2 = System.currentTimeMillis();
System.out.println("FTP服务器过期数据文件清理 -- " + FtpPathName + " 目录," + deleteNum + " 个文件已删除,用时 " + (t2 - t1) + " ms!");

return deleteNum;
}

/**
* 获取FtpMode
* @return String FtpMode
*/
public String getFtpMode()
{
return FtpMode;
}

/**
* 设置FtpMode
* @param ftpMode FtpMode
*/
public void setFtpMode(String ftpMode)
{
FtpMode = ftpMode;
}

//	/**
//	 * 获取ConfigClientFtpMode
//	 * @return String ConfigClientFtpMode
//	 */
//	public static String getConfigClientFtpMode()
//	{
//		return ConfigClientFtpMode;
//	}
//
//	/**
//	 * 设置ConfigClientFtpMode
//	 * @param configClientFtpMode ConfigClientFtpMode
//	 */
//	public static void setConfigClientFtpMode(String configClientFtpMode)
//	{
//		ConfigClientFtpMode = configClientFtpMode;
//	}
//
//	/**
//	 * 获取ConfigFtpMode
//	 * @return String ConfigFtpMode
//	 */
//	public static String getConfigFtpMode()
//	{
//		return ConfigFtpMode;
//	}
//
//	/**
//	 * 设置ConfigFtpMode
//	 * @param configFtpMode ConfigFtpMode
//	 */
//	public static void setConfigFtpMode(String configFtpMode)
//	{
//		ConfigFtpMode = configFtpMode;
//	}

}// END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐