`

使用Commons-net包实现ftp服务器的访问

    博客分类:
  • Java
阅读更多

项目需要实现从某银行的ftp服务器上定时下载数据文件的模块.于是使用apache的commons-net包实现ftp服务器的链接

中间使用了commons的io和Oro包.Io包封装了一些使用的方法,eg:安全的关闭各种流.根据文件的长度得到文件的方便识别的大小(k,m.g).还有一些其它使用的方法,读者可以下载后自行研究..

commons-net包封装了一些常见的网络包:ftp,smtp,pop3等..本文使用了ftp包的功能. 代码如下:

java 代码
  1. import java.io.IOException;   
  2. import java.io.OutputStream;   
  3.   
  4. import org.apache.commons.io.FileUtils;   
  5. import org.apache.commons.io.IOUtils;   
  6. import org.apache.commons.net.ftp.FTPClient;   
  7. import org.apache.commons.net.ftp.FTPFile;   
  8.   
  9. /**  
  10.  * 使用commons的net包进行ftp链接.  
  11.  * 相关包:commons-net-1.4.1.jar ; commons-io-1.2.jar;jakarta-oro-2.0.8.jar测试通过.可以列出ftp上的文件  
  12.  * 通过把ftp服务器上的文件流连接到outSteam及可以把文件下载到本机的目录..限制如果目录为中文则需要处理.最好使用英文文件名  
  13.  * @author xzgf  
  14.  * email: 
  15.  * 
     
  16.  * @create 2007-2-11  
  17.  *  
  18.  */  
  19. public class ListFtpFile {   
  20.   
  21.     private FTPClient ftpClient = new FTPClient();   
  22.        
  23.     private OutputStream outSteam = null;   
  24.        
  25.     /**  
  26.      * ftp服务器地址  
  27.      */  
  28.     private String hostName = "127.0.0.1";   
  29.        
  30.     /**  
  31.      * 登录名  
  32.      */  
  33.     private String userName = "1";   
  34.        
  35.     /**  
  36.      * 登录密码  
  37.      */  
  38.     private String password = "1";   
  39.        
  40.     /**  
  41.      * 需要访问的远程目录  
  42.      */  
  43.     private String remoteDir = "/ClientTest";   
  44.        
  45.     /**  
  46.      * 登录方法  
  47.      *  
  48.      */  
  49.     private void login() {   
  50.         try {   
  51.             //链接到ftp服务器   
  52.             ftpClient.connect(hostName);   
  53.             System.out.println("连接到ftp服务器:" + hostName + " 成功..开始登录");   
  54.             //登录.用户名 密码   
  55.             ftpClient.login(userName, password);   
  56.             System.out.println("登录成功.");   
  57.                
  58.             FTPFile[] remoteFiles = ftpClient.listFiles(remoteDir);   
  59.             System.out.println("目录" + remoteDir + "下的文件:");   
  60.             if(remoteFiles != null) {   
  61.                 for(int i=0;i
  62.                     String name = remoteFiles[i].getName();   
  63.                     long length = remoteFiles[i].getSize();   
  64.                     String readableLength = FileUtils.byteCountToDisplaySize(length);   
  65.                     System.out.println(name + ":\t\t" + readableLength);   
  66.                 }   
  67.             }   
  68.                
  69.         } catch (Exception e) {   
  70.             e.printStackTrace();   
  71.         } finally {   
  72.             //使用IO包关闭流   
  73.             IOUtils.closeQuietly(outSteam);   
  74.             try {   
  75.                 ftpClient.disconnect();   
  76.             } catch (IOException ioe) {   
  77.                 ioe.printStackTrace();   
  78.             }   
  79.         }   
  80.     }   
  81.        
  82.     public static void main(String[] args) {   
  83.         ListFtpFile listFtpfiles = new ListFtpFile();   
  84.         listFtpfiles.login();   
  85.     }   
  86. }   

寥寥几行实现了ftp服务器某个目录下的所有文件.当然本例中没有处理中文的问题,所以如果ftp上存在中文目录,则会出现乱码.

通过获得ftp的流,可以将文件下载到本地.配合正则表达式,可以实现从服务器上下载匹配规则的文件....

欢迎交流..

分享到:
评论
10 楼 cuclh27 2007-04-11  
有没有用apache的commons-net开发的ftp上传或者下载进度的代码啊,谢谢拉!!
9 楼 cuclh27 2007-04-09  
有没有处理中文文件夹或者中文文件名的dd
8 楼 fujohnwang 2007-02-13  
package org.darrenstudio.wrapper.ftp;

import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPReply;


/**
 * A Wrapper Class to Commons Net's FTPClient to ease the ftp transfer process
 * so Jakarta Commons Net needed.
 * @author Darren.Wang
 * @since 1.0 (2005-06-13)
 */
public class FtpTemplate {
	
	private FTPClientConfig ftpClientConfig;// optional 
	//
	private String server;// required
	private String username; // required
	private String password; // required
	//
	public FtpTemplate(String server,String user,String pwd)
	{
		this.server   = server;
		this.username = user;
		this.password = pwd;
	}
	
	public void transfer(FtpTransferCallback callback) throws IOException
	{
		FTPClient ftp = new FTPClient();
		try {
			if(this.getFtpClientConfig() != null)
				ftp.configure(this.getFtpClientConfig());
			ftp.connect(server);
			// check whether the connection to server is confirmed
			int reply = ftp.getReplyCode();
			if(!FTPReply.isPositiveCompletion(reply)) 
			{
		        ftp.disconnect();
		        throw new IOException("failed to connect to the FTP Server:"+server);
			}
			// login
			ftp.login(this.getUsername(),this.getPassword());
			
			// do your ftp operations in call back method
			callback.doTransfer(ftp);
			
			// logout
			ftp.logout();
			
		}
		finally
		{
			if(ftp.isConnected())
			{
				ftp.disconnect();
			}
		}
	}
	
	
	// Setters and getters
	public FTPClientConfig getFtpClientConfig() {
		return ftpClientConfig;
	}
	public void setFtpClientConfig(FTPClientConfig ftpClientConfig) {
		this.ftpClientConfig = ftpClientConfig;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getServer() {
		return server;
	}
	public void setServer(String server) {
		this.server = server;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
}
7 楼 eonhy 2007-02-13  
这个办法不错

以前做过一个通过定时器访问SAMBA目录读取数据文件的实现
6 楼 neptune 2007-02-13  
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;
}

}
5 楼 inprise_lyj 2007-02-13  
不错,收着。
4 楼 jamesby 2007-02-12  
有没有上传功能,如果有,那文件共享又多了一种思路,通过FTP服务器实现文件共享,简单方便!
3 楼 jvincent 2007-02-12  
连上服务器只是第一步,还需要定义一个job来定时执行.所以不能像楼上说的那样.
2 楼 caocao 2007-02-12  
不错,apache的那些commons包很灵。
楼主有否考虑写ant的build.xml,让ant来搞定?
1 楼 zack 2007-02-12  
不错不错,好东西。有空要仔细看一看的。

相关推荐

    commons-net-3.1.jar,3.3,3.6版本

    这个库在不同的版本中提供了各种功能的增强和优化,比如`commons-net-3.1.jar`, `commons-net-3.3.jar`, 和 `commons-net-3.6.jar`。下面将详细阐述这些版本中涉及的主要知识点: 1. **FTP(文件传输协议)支持**:...

    commons-io-1.4.jar等

    JAVA连接FTP服务器,并上传/下载文件的,使用commons-net包实现ftp服务器的访问,commons-net包封装了一些常见的网络包:ftp,smtp,pop3等..相关包:commons-net-1.4.1.jar ; commons-io-1.4.jar;jakarta-oro-2.0.8.jar

    commons-net-3.3源码包

    在这个"commons-net-3.3源码包"中,我们可以深入理解其实现细节,对其进行定制和扩展,这对于开发人员来说非常有用。下面我们将详细探讨此源码包中的关键知识点。 1. **FTP协议实现**: Commons Net库的核心功能之...

    java commons-net 类库

    无论是在构建FTP服务器客户端、实现网络诊断工具,还是处理其他网络通信需求,Java Commons-Net都是一个强大且可靠的工具。通过阅读提供的`commons-net-3.3.jar`文件,开发者可以直接将该库导入项目中,开始利用其...

    com.jcraft.jschjar和commons-net

    总结来说,"com.jcraft.jsch.jar"和"commons-net"是Java开发中处理网络通信特别是SSH和FTP任务的重要工具,而.NET平台也有类似的功能实现,为不同平台的开发者提供了丰富的网络通信解决方案。了解并熟练运用这些库,...

    commons-net

    在FTP方面,commons-net提供了`FTPClient`类,这是一个功能强大的类,可以用于连接FTP服务器,执行上传、下载、删除文件,创建或删除目录等操作。例如,你可以使用`connect()`方法建立连接,`login()`方法进行身份...

    ftp所需jar包(commons-net-1.4.1.jar,jakarta-oro-2.0.8.jar)

    在这个场景中,我们关注的是两个特定的Java库文件:`commons-net-1.4.1.jar` 和 `jakarta-oro-2.0.8.jar`,它们是实现FTP功能的关键组件。 `commons-net-1.4.1.jar` 是Apache Commons Net库的一个版本,这是一个...

    commons-net-3.2

    通过使用FTPClient类,开发者可以方便地与FTP服务器进行交互,实现文件的高效传输。此外,FTPFile类则用于表示FTP服务器上的文件和目录信息,提供了丰富的属性和方法来获取文件的详细信息。 SMTP(简单邮件传输协议...

    aduna-commons-net-2.1.jar.zip

    这个库,以"aduna-commons-net-2.1.jar.zip"的形式提供,包含了丰富的网络编程接口和实现,为开发者提供了强大的网络操作支持。 Aduna Commons Net是Apache软件基金会的一个项目,其核心目标是为Java开发者提供一组...

    commons-logging-1.2.jar commons-vfs-2.2.jar

    使用Apache Commons VFS的SFTP模块,开发者可以轻松地在代码中实现对远程SFTP服务器的文件操作,例如上传、下载、列出目录内容、重命名或删除文件等,而无需关心具体的文件系统细节。Apache Commons Logging则负责...

    commons-net-3.3

    在使用`commons-net-3.3.jar`时,确保将其添加到项目的类路径或依赖管理中。如果你使用的是Maven或Gradle,可以将Apache Commons Net作为依赖添加到构建文件中,以便自动下载和管理库。 总的来说,Apache Commons ...

    commons-net-1.4.1.jar

    这个库的核心版本是`commons-net-1.4.1.jar`,它包含了丰富的类和方法,使得开发者能够方便地实现各种网络功能。 在`commons-net-1.4.1.jar`中,我们可以找到许多关键组件,包括: 1. **FTP(文件传输协议)**: 这...

    commons-vfs-1.0-src

    `FileSystem`表示一个具体的文件系统,如本地文件系统或FTP服务器;`FileSystemManager`则是管理这些文件系统的工厂类,负责创建和配置文件系统。 2. **协议支持**:VFS的设计允许扩展以支持多种协议,如`file:`、`...

    commons-net源码包

    1. **FTP协议实现**:Apache Commons Net包含了一个完整的FTP客户端库,支持主动和被动模式,断点续传,FTP上传和下载,以及FTP服务器的命令交互。源码中`org.apache.commons.net.ftp`包下的类,如`FTP`、`FTPClient...

    commons-net-3.4-src.zip

    接着,`TelnetClient`类实现了Telnet协议,用于远程终端访问。源码中,它处理了诸如IAC(Inter-Active Command)这样的特殊字符,以实现不同终端环境下的字符编码和控制序列的处理。`TelnetOptionHandler`接口和相关...

    ant-commons-net-1.7.0.jar.zip

    `ant.license.txt`文件通常包含Apache软件基金会项目的许可证信息,它详细说明了如何使用、修改和分发`ant-commons-net-1.7.0.jar`的条款。Apache Commons Net遵循Apache License Version 2.0,这是一个非常宽松的...

    aduna-commons-net-2.2.jar.zip

    例如,一个需要从FTP服务器下载大量文件的应用,可以通过Aduna Commons Net的FTP客户端轻松实现;又如,一个需要监控网络状态并找出开放端口的系统,可以利用其端口扫描功能。 总之,"aduna-commons-...

    apache-commons-net-3.0.1-src

    "apache-commons-net-3.0.1-src"是一个源代码版本,允许开发者深入理解其内部工作原理,并根据需要进行定制或扩展。 FTP(File Transfer Protocol)是互联网上最常用的文件传输协议之一,Apache Commons Net提供了...

    commons-net压缩包

    通过`FTPClient`类,开发者可以方便地实现FTP交互,而`FTPFile`类则代表FTP服务器上的文件或目录信息。 **Telnet协议支持**: 对于需要与远程服务器进行Telnet通信的应用,Apache Commons Net提供了`TelnetClient`...

    ant-commons-net-1.6.2.jar.zip

    在Ant中,这个库被用来处理与网络相关的任务,例如上传或下载文件到FTP服务器,发送电子邮件,或者访问其他网络服务。 "ant-commons-net-1.6.2.jar"是这个库的特定版本,版本号1.6.2。这个JAR文件包含了所有必要的...

Global site tag (gtag.js) - Google Analytics