项目需要实现从某银行的ftp服务器上定时下载数据文件的模块.于是使用apache的commons-net包实现ftp服务器的链接
中间使用了commons的io和Oro包.Io包封装了一些使用的方法,eg:安全的关闭各种流.根据文件的长度得到文件的方便识别的大小(k,m.g).还有一些其它使用的方法,读者可以下载后自行研究..
commons-net包封装了一些常见的网络包:ftp,smtp,pop3等..本文使用了ftp包的功能. 代码如下:
java 代码
- package org.uranus.tools.net.ftp;
- 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;
- }
- }