import
				 java.io.InputStream;
				import
				 java.util.Properties;

				import
				 org.apache.commons.net.ftp.FTPClient;
				import
				 org.apache.commons.net.ftp.FTPClientConfig;
				import
				 org.apache.commons.net.ftp.FTPReply;
				import
				 org.uranus.util.StringUtils;


				/** */
				
						/**
						
								
								
* 基于apache组织的commonNet开源组件实现ftp客户端<br>
* 本程序运行依赖于一个config成员变量属性,其是一个属性(Properties)对象<br>
* 系统要求这个config对象,必需有如下属性key:<br>
* server(ftp服务器ip地址或域名)<br>
* username(登录用户名)<br>
* password(登录密码)<br>
* 如下属性key是可选的:<br>
* systemKey(ftp服务器的操作系统key,如window)<br>
* serverLanguageCode(ftp服务器使用的语言,如zh)<br>
* <br>
* 本程序是线程安全,在每一个上传时都将创建ftp连接,上传结束后再关闭ftp连接<br>
*
* 例子:<br>
* InputStream localIn = new FileInputStream("c:\\计算机.txt");<br>
*
* java.util.Properties config = new Properties();<br>
* config.setProperty("server", "192.168.5.120");<br>
* config.setProperty("username", "upload");<br>
* config.setProperty("password", "upload");<br>
*
* FtpClientCommonNetImpl client = new FtpClientCommonNetImpl();<br>
* client.setConfig(config);<br>
* client.upload(localIn, "/aaa/计算机.txt", true);<br>
*
*
* 
						@author
						 zhangdb
*
						*/
				
				
						
						
						
				
				public
				 
				class
				 FtpClientCommonNetImpl 
				implements
				 IFtpClient 
				
						
				
				
						{
						//
						 ftp配置
						
								
								
						
						private
						 Properties config;


						/** */
						
								/**
								
										
										
* 连接到ftp服务器
*
* 
								@param
								 server
* 
								@param
								 userName
* 
								@param
								 password
* 
								@return
								
										
										
* 
								@throws
								 FtpException
								*/
						
						
								
								
						
						protected
						 FTPClient connectFtpServer(String server, String userName,

String password) 
						throws
						 FtpException 
						
								
						
						
								{
								//
								 创建ftp客户端对象
								
										
										
								
								FTPClient ftp 
								=
								 
								new
								 FTPClient();

								try
								 
								
										
								
								
										{
ftp.configure(
										this
										.getFTPClientConfig());
										//
										 连接ftp服务器
										
												
												
										
										ftp.connect(server);
										//
										 登录
										
												
												
										
										ftp.login(userName, password);

										//
										 返回值
										
												
												
										
										int
										 reply 
										=
										 ftp.getReplyCode();

										if
										 ((
										!
										FTPReply.isPositiveCompletion(reply))) 
										
												
										
										
												{
ftp.disconnect();
												throw
												 
												new
												 FtpException(
												"
												登录ftp服务器失败,请检查server[
												"
												 
												+
												 server
												+
												 
												"
												]、username[
												"
												 
												+
												 userName 
												+
												 
												"
												]、password[
												"
												 
												+
												 password
												+
												 
												"
												]是否正确!
												"
												);
}
										
										
												
												
												
												
										
										return
										 ftp;

}
								
								 
								catch
								 (Exception ex) 
								
										
								
								
										{
										throw
										 
										new
										 FtpException(ex);
}
								
								
										
										
}
						
						
								
								
								
								
								
						
						/** */
						
								/**
								
										
										
* 关闭连接
*
* 
								@param
								 ftp
								*/
						
						
								
								
								
						
						protected
						 
						void
						 disconnectFtpServer(FTPClient ftp) 
						
								
						
						
								{

								try
								 
								
										
								
								
										{
ftp.logout();
ftp.disconnect();

}
								
								 
								catch
								 (Exception ex) 
								
										
								
								
										{
										throw
										 
										new
										 FtpException(ex);
}
								
								
										
										
}
						
						
								
								
								
								
								
						
						/** */
						
								/**
								
										
										
* 上传
								*/
						
						
								
								
						
						public
						 
						void
						 upload(InputStream localIn, String remoteFilePath)

						throws
						 FtpException 
						
								
						
						
								{
String server 
								=
								 
								this
								.config.getProperty(
								"
								server
								"
								);
String userName 
								=
								 
								this
								.config.getProperty(
								"
								username
								"
								);
String password 
								=
								 
								this
								.config.getProperty(
								"
								password
								"
								);
FTPClient ftp 
								=
								 
								this
								.connectFtpServer(server, userName, password);


								try
								 
								
										
								
								
										{
										boolean
										 result 
										=
										 ftp.storeFile(
										this
										
												
												
.enCodingRemoteFilePath(remoteFilePath), localIn);

										if
										 (
										!
										result) 
										
												
										
										
												{
												throw
												 
												new
												 FtpException(
												"
												文件上传失败!
												"
												);
}
										
										
												
												
												
}
								
								 
								catch
								 (Exception ex) 
								
										
								
								
										{
										throw
										 
										new
										 FtpException(ex);

}
								
								 
								finally
								 
								
										
								
								
										{
										this
										.disconnectFtpServer(ftp);
}
								
								
										
										
}
						
						
								
								
								
								
								
						
						/** */
						
								/**
								
										
										
* 上传结束以后关闭输入流
*
* 
								@param
								 localIn
* 
								@param
								 remoteFilePath
* 
								@param
								 afterUploadCloseInputStream
* 
								@throws
								 FtpException
								*/
						
						
								
								
						
						public
						 
						void
						 upload(InputStream localIn, String remoteFilePath,

						boolean
						 afterUploadCloseInputStream) 
						throws
						 FtpException 
						
								
						
						
								{

								try
								 
								
										
								
								
										{
										//
										 上传
										
												
												
										
										this
										.upload(localIn, remoteFilePath);

}
								
								 
								finally
								 
								
										
								
								
										{

										if
										 (afterUploadCloseInputStream) 
										
												
										
										
												{

												if
												 (localIn 
												!=
												 
												null
												) 
												
														
												
												
														{

														try
														 
														
																
														
														
																{
localIn.close();

}
														
														 
														catch
														 (Exception ex) 
														
																
														
														
																{
																throw
																 
																new
																 FtpException(ex);
}
														
														
																
																
}
												
												
														
														
}
										
										
												
												
}
								
								
										
										
}
						
						
								
								
								
								
								
						
						/** */
						
								/**
								
										
										
* 得到配置
*
* 
								@return
								
										
										
								
								*/
						
						
								
								
								
						
						protected
						 FTPClientConfig getFTPClientConfig() 
						
								
						
						
								{
								//
								 创建配置对象
								
										
										
								
								FTPClientConfig conf 
								=
								 
								new
								 FTPClientConfig(
								this
								.config.getProperty(
								"
								systemKey
								"
								, FTPClientConfig.SYST_NT));
conf.setServerLanguageCode(
								this
								.config.getProperty(
								"
								serverLanguageCode
								"
								, 
								"
								zh
								"
								));
								return
								 conf;
}
						
						
								
								
								
								
								
						
						/** */
						
								/**
								
										
										
* 远程文件路径编码(上传到ftp上的文件路径)
*
* 
								@param
								 remoteFilePath
* 
								@return
								
										
										
								
								*/
						
						
								
								
								
						
						protected
						 String enCodingRemoteFilePath(String remoteFilePath) 
						
								
						
						
								{
								return
								 StringUtils.gbkToIso8859EnCoding(remoteFilePath);
}
						
						
								
								
								
								
								
						
						public
						 Properties getConfig() 
						
								
						
						
								{
								return
								 config;
}
						
						
								
								
								
								
								
						
						public
						 
						void
						 setConfig(Properties config) 
						
								
						
						
								{
								this
								.config 
								=
								 config;
}
						
						
								
								
								
								
}
				
				 
		 
	posted on 2007-03-28 19:42 
Ken.Lee 阅读(1066) 
评论(0)  编辑  收藏