`
longforfreedom
  • 浏览: 198805 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Commons net之FTP

阅读更多

     最近用到FTP相关的操作,因为有伟大开源社区的存在,也不用自己再实现一把FTP协议了,看了下常用的FTP软件包,主要有Apache和Commons net中的Commons FTP和JDK中的自带的ftp操作类,看了下网友们写的例子,对比了一下。虽然我也不想每一个项目都依赖一堆外部JAR包,但还是选择采用Commons FTP,主要原因就是JDK中自带的是sun的内部包,并没有公开,并不能保证以后版本中能用。为方便使用,由于需要的功能也比较简单,也就做了下简单的封装。代码如下:

 

package org.migle.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

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

/**
 * FTP Client工具类,封装了<a href="http://commons.apache.org/net/">Jakarta Commons Net
 * FTPClient</a>对常用的功能如上传、下载 等功能提供简易操作,如果需要Jakarta Commons Net
 * FTPClient的全部功能可以通过{@link #getFtpclient()}
 * 得到org.apache.commons.net.ftp.FTPClient
 * 对象,对于org.apache.commons.net.ftp.FTPClient的全部功能有请查看 <a href =
 * "http://commons.apache.org/net/api/org/apache/commons/net/ftp/FTPClient.html"
 * > FTPClient API </a>
 * 
 * @since V2.0
 * @version V1.0 2010-2-26
 * @author 研发中心
 */
public class FTPClientUtil {

	private static Log logger = LogFactory.getLog(FTPClient.class);

	private FTPClient ftpclient;

	public FTPClientUtil(String host, int port) throws Exception {
		this(host, port, null, null);
	}

	public FTPClientUtil(String host, int port, String username, String password)
			throws Exception {
		ftpclient = new FTPClient();
		try {
			ftpclient.connect(host, port);
			int reply = ftpclient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpclient.disconnect();
				logger.fatal("FTP服务器拒绝连接");
				throw new Exception("FTP服务器拒绝连接");
			}
			if (username != null) {
				if (!ftpclient.login(username, password)) {
					ftpclient.disconnect();
					logger.fatal("登陆验证失败,请检查账号和密码是否正确");
					throw new Exception("登陆验证失败,请检查账号和密码是否正确");
				}
			}
		} catch (SocketException e) {
			logger.fatal("无法连接至指定FTP服务器", e);
			throw new Exception(e);
		} catch (IOException e) {
			logger.fatal("无法用指定用户名和密码连接至指定FTP服务器", e);
			throw new Exception(e);
		}
	}

	/**
	 * 
	 * @param path
	 *            文件在FTP上存储的绝路径
	 * @param input
	 *            上传文
	 * @throws IOException
	 */
	public boolean upload(String pathname, InputStream input)
			throws IOException {
		// 是否是在根目录 下
		ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
		if (pathname.indexOf("/") != -1) {
			String path = pathname.substring(0, pathname.lastIndexOf("/"));
			mkdir(path);
		}
		return ftpclient.storeFile(new String(pathname.getBytes(), ftpclient.getControlEncoding()), input);
	}

	/**
	 * 从FTP服务器上下载pathname指定的文件,命名为localName
	 * 
	 * @param pathname
	 * @param localName
	 * @return
	 * @throws Exception
	 */
	public boolean download(String pathname, String localName) throws Exception {
		String filename = localName != null ? localName : pathname
				.substring(pathname.lastIndexOf("/") + 1);

		if (filename == null || filename.isEmpty()) {
			return false;
		}

		// 设置被动模式
		ftpclient.enterLocalPassiveMode();
		// 设置以二进制方式传输
		ftpclient.setFileType(FTP.BINARY_FILE_TYPE);

		if (ftpclient.listFiles(new String(pathname.getBytes(),ftpclient.getControlEncoding())).length == 0) {
			logger.fatal("下载文件不存在");
			throw new Exception("下载文件不存在");
		}

		File tmp = new File(filename + "_tmp"); // 临时文件
		File file = new File(filename);
		FileOutputStream output = null;
		boolean flag;
		try {
			output = new FileOutputStream(tmp);
			flag = ftpclient.retrieveFile(new String(pathname.getBytes(),ftpclient.getControlEncoding()), output);
			output.close();
			if (flag) {
				// 下载成功,重命名临时文件。
				tmp.renameTo(file);
				System.out.println(file.getAbsolutePath());
			}
		} catch (FileNotFoundException e) {
			logger.fatal("下载文件失败", e);
			throw new Exception(e);
		} finally {
			output.close();
		}

		return flag;
	}

	/**
	 * 只删除文件,如果删除空目录请用如下方法: <code>
	 * 	getFtpclient().removeDirectory(String pathname) 
	 * </code> 参考
	 * {@link org.apache.commons.net.ftp.FTPClient FTPClient}
	 * 
	 * @param pathname
	 * @return 成功删除返回true,否则返回false(如果文件不存在也返回false)
	 * @throws IOException
	 */
	public boolean delete(String pathname) throws IOException {
		return ftpclient.deleteFile(new String(pathname.getBytes(),ftpclient.getControlEncoding()));
	}

	/**
	 * 改变当前目录至pathname,"/"代表根目录
	 * 
	 * @param pathname
	 *            路径名
	 * @return 如果改变成功返true否则返回false
	 * @throws IOException
	 */
	public boolean changeWorkingDirectory(String pathname) throws IOException {
		return ftpclient.changeWorkingDirectory(new String(pathname.getBytes(),ftpclient.getControlEncoding()));
	}

	/**
	 * @return {@link org.apache.commons.net.ftp.FTPClient FTPClient}对象
	 */
	public FTPClient getFtpclient() {
		return this.ftpclient;
	}

	/**
	 * @param ftpclient
	 *            {@link org.apache.commons.net.ftp.FTPClient FTPClient}对象
	 */
	public void setFtpclient(FTPClient ftpclient) {
		this.ftpclient = ftpclient;
	}

	public void close() throws Exception {
		ftpclient.disconnect();
	}

	/**
	 * 
	 * @param pathname
	 *            要创建的目录路径,可以是相对路径,也可以是绝路径("/"开始)
	 * @return 如果成功创建目录返回true,否则返回false(如果目录已存在也返回false)
	 * @throws IOException
	 */
	public boolean mkdir(String pathname) throws IOException {
		//ftpclient.setControlEncoding("ISO-8859-1");
		//注意编码,如果不编码文件中文目录无法创建
		return ftpclient.makeDirectory(new String(pathname.getBytes(),ftpclient.getControlEncoding()));
	}

	public static void main(String[] args) throws Exception {
		// URI uri = new URI(
		// "ftp://100.180.185.205/oracle_10201_database_win32/database/welcome.html");
		// System.out.println(uri.toURL().getHost());
		// System.out.println(uri.toURL().getPath());
		// System.out.println(uri.toURL().getFile());

		FTPClientUtil ftputil = new FTPClientUtil("100.180.185.205", 21, "username",
				"password");
		System.out.println(ftputil.mkdir("测试"));
		ftputil.close();
//		ftputil.upload("drop.sql", new FileInputStream("c:/drop.sql"));
//		ftputil.download("/drop.sql", "drop.sql");
		// FTPClient ftp = ftputil.getFtpclient();
		// FTPListParseEngine engine = ftp.initiateListParsing();
		// System.out.println(ftp.listFiles().length);
		// while (engine.hasNext()) {
		// FTPFile[] files = engine.getNext(25); // "page size" you want
		// }

		// FTPClient ftpclient = ftputil.getFtpclient();
		//
		// FTPFile[] f = ftpclient.listFiles("/kk/aa/drop2.sql");
		// System.out.println(f.length);
		// System.out.println(ftpclient.makeDirectory("/tt/aa/bb"));
		// System.out.println(ftpclient.getReplyString());
		// ftpclient.changeWorkingDirectory("/tt/aa/bb");
		//		
		// //System.out.println(ftpclient.deleteFile("/tt/aa/cc/"));
		// System.out.println(ftpclient.getReplyString());
		// ftpclient.changeWorkingDirectory("/");
		// System.out.println(ftpclient.listFiles().length);

//		System.out.println("a".lastIndexOf("/"));
	}
}
分享到:
评论
3 楼 longforfreedom 2010-08-12  
zhanglongchao 写道
你好我想问一下如何遍历ftp上的目录结构,并取出子文件的名称了,你有实例的话发给我,
谢谢你了,我的邮箱wnsx7218@qq.com

不好意思,最近不能上外网,才看到你的回复,你看看Commons net的API吧,是里面好像直接有一个方法(ListFiles吧我也忘记了)
2 楼 zhanglongchao 2010-07-30  
哦!我不需要下载文件,只要取出名字就OK了如何实现?
1 楼 zhanglongchao 2010-07-30  
你好我想问一下如何遍历ftp上的目录结构,并取出子文件的名称了,你有实例的话发给我,
谢谢你了,我的邮箱wnsx7218@qq.com

相关推荐

    commons-net-ftp-2.0.jar.zip

    《Apache Commons Net FTP库在Java开发中的应用》 Apache Commons Net是一个Java库,它提供了对各种网络协议的支持,其中就包括FTP(File Transfer Protocol)协议。在这个特定的案例中,我们关注的是`commons-...

    org.apache.commons.net.ftp.FTP**完整jar包

    .net.ftp.FTPClient jar ,exaple, commons-net-2.0.jar

    org.apache.commons.net.ftp.FTPClient包

    org.apache.commons.net.ftp.FTPClient包,不错,在实际项目和产品中使用过。

    用org.apache.commons.net.ftp.FTPClient包实现简单文件下载

    在Java编程中,Apache Commons Net库提供了一系列工具类来处理各种网络协议,其中包括FTP(文件传输协议)。在本文中,我们将深入探讨如何使用`org.apache.commons.net.ftp.FTPClient`包来实现简单的文件下载功能。...

    org.apache.commons.net.ftp jar包及FTP调用例子

    上传了收集的最新的 commons-io-2.4.jar 包 和 commons-net-3.3.jar 以及 FTP java调用例子。net 包是一个用于操作Internet基础协议(Finger,Whois,TFTP,Telnet,POP3,FTP,NNTP,以及SMTP)的底层API。Net包...

    org.apache.commons.net.ftp的官方完整jar包

    org.apache.commons.net.ftp的官方完整jar包 放心使用

    commons-net实现ftp帮助文档 api

    Apache Commons Net库是一个Java库,专门用于处理各种网络协议,其中FTP(文件传输协议)是其核心功能之一。本帮助文档API将详细解释如何利用这个库来实现FTP相关的操作。 FTP(File Transfer Protocol)是一种标准...

    org.apache.commons.net.ftp.FTPClient jar包

    FTP应用的jar包,主要用于java开发FTP上传下载

    org.apache.commons.net.ftp

    Apache Commons Net库是Java开发人员在处理网络协议时的一个强大工具,特别是对于FTP(文件传输协议)操作。标题"org.apache.commons.net.ftp"表明这个压缩包包含了与Apache Commons Net库中FTP相关的类和功能。描述...

    Apache Commons Net » 3.3 org.apache.commons.net.ftp.FTPClient

    Apache Commons Net库是Java开发人员在处理各种网络协议时常用的一个工具包,其中包括对FTP(文件传输协议)的全面支持。在3.3版本中,`org.apache.commons.net.ftp.FTPClient`类是实现FTP通信的核心组件。这个类...

    FTP上傳使用commons-net

    Apache Commons Net是Java库,提供了对FTP协议的全面支持,使得开发者能够轻松地在Java应用程序中实现FTP功能,包括上传、下载、删除文件等操作。在这个场景中,我们将详细探讨如何使用Apache Commons Net库进行FTP...

    commons-net-ftp-2.0.rar

    Apache Commons Net库是Java开发人员在处理网络协议时的一个强大工具,特别是对于FTP(文件传输协议)客户端编程。这个库,如"commons-net-ftp-2.0.rar"所示,包含了一系列的JAR文件,使得开发者能够轻松地构建FTP...

    Android 利用commons-net-3.3实现ftp上传下载Demo

    本教程将深入讲解如何利用Apache Commons Net库的3.3版本在Android应用中实现FTP功能。 首先,Apache Commons Net是一个Java库,提供了一系列用于网络通信的类和实用工具,包括FTP客户端组件。在Android项目中,...

    使用Apache commons-net.jar开发FTP工具类

    Apache Commons Net是一个强大的Java库,提供了多种网络协议的实现,包括FTP(文件传输协议)。在本文中,我们将深入探讨如何利用这个库开发一个FTP工具类,以便在Java应用程序中进行文件上传、下载和其他FTP操作。 ...

    commons-net-2.0-ftp.jar

    commons-net-2.0-ftp.jar

    Android commons ftp使用demo

    本文将详细讲解如何在Android应用中使用Apache Commons Net库进行FTP操作,并提供一个具体的`ftpDemo`示例。 Apache Commons Net是Apache软件基金会的一个开源项目,它提供了一系列用于网络编程的实用工具,其中...

    commons-ftp中ftpClient类的API.pdf

    根据提供的文件信息,可以看出文档的主题是关于commons-ftp库中的FTPClient类的API使用指南。commons-ftp是一个Java开源库,用于在应用程序中实现FTP协议的相关操作,如文件上传、下载、删除等。FTPClient是这个库中...

    commons-net-3.6.jar

    《Apache Commons Net 3.6:FTP操作与源码解析》 Apache Commons Net是一个Java库,专注于网络协议的实现,尤其是FTP(文件传输协议)相关的功能。在这个版本中,我们聚焦于`commons-net-3.6.jar`,它提供了丰富的...

    commons-net-3.0.1.jar ftp4j

    Apache Commons Net库与Ftp4j是Java编程中用于FTP(文件传输协议)操作的重要工具。这两个库在处理文件上传、下载以及管理FTP服务器时扮演着关键角色。 Apache Commons Net是一个由Apache软件基金会开发的Java类库...

Global site tag (gtag.js) - Google Analytics