`
wuhongyu
  • 浏览: 406941 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

FTP客户端(利用sun.net.ftp.FtpClient实现)

阅读更多

    昨天帮同事弄java上传文件到ftp服务器,用的sun.net.ftp.FtpClient,感觉很简单,也很好用,写了个小例子,留作备份。

 

    这个小例子实现了文件(或文件夹)上传,文件下载,取得某目录下文件列表等功能,对于文件夹下载还没有实现,改天有空改完了再贴上来吧。由于通过设定好的用户名、密码登陆到ftp server时,连接到的目录不一定是根目录,有可能是根目录下很深层的一个子目录,比如“usr/why/test/ftp/upload/exercise/20090730”,所以我觉得针对当前连接目录进行操作,要比每次都从根目录开始指定方便。

 

package com.why.ftp;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;

/**
 * ftp上传,下载
 * @author why 2009-07-30
 *
 */
public class FtpUtil {

	private String ip = "";

	private String username = "";

	private String password = "";

	private int port = -1;

	private String path = "";

	FtpClient ftpClient = null;

	OutputStream os = null;

	FileInputStream is = null;

	public FtpUtil(String serverIP, String username, String password) {
		this.ip = serverIP;
		this.username = username;
		this.password = password;
	}
	
	public FtpUtil(String serverIP, int port, String username, String password) {
		this.ip = serverIP;
		this.username = username;
		this.password = password;
		this.port = port;
	}

	/**
	 * 连接ftp服务器
	 * 
	 * @throws IOException
	 */
	public boolean connectServer(){
		ftpClient = new FtpClient();
		try {
			if(this.port != -1){
					ftpClient.openServer(this.ip,this.port);
			}else{
				ftpClient.openServer(this.ip);
			}
			ftpClient.login(this.username, this.password);
			if (this.path.length() != 0){
				ftpClient.cd(this.path);// path是ftp服务下主目录的子目录			
			}
			ftpClient.binary();// 用2进制上传、下载
			System.out.println("已登录到\"" + ftpClient.pwd() + "\"目录");
			return true;
		}catch (IOException e){
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 断开与ftp服务器连接
	 * 
	 * @throws IOException
	 */
	public boolean closeServer(){
		try{
			if (is != null) {
				is.close();
			}
			if (os != null) {
				os.close();
			}
			if (ftpClient != null) {
				ftpClient.closeServer();
			}
			System.out.println("已从服务器断开");
			return true;
		}catch(IOException e){
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 检查文件夹在当前目录下是否存在
	 * @param dir
	 * @return
	 */
	 private boolean isDirExist(String dir){
		 String pwd = "";
		 try {
			 pwd = ftpClient.pwd();
			 ftpClient.cd(dir);
			 ftpClient.cd(pwd);
		 }catch(Exception e){
			 return false;
		 }
		 return true; 
	 }
	
	/**
	 * 在当前目录下创建文件夹
	 * @param dir
	 * @return
	 * @throws Exception
	 */
	 private boolean createDir(String dir){
		 try{
			ftpClient.ascii();
			StringTokenizer s = new StringTokenizer(dir, "/"); //sign
			s.countTokens();
			String pathName = ftpClient.pwd();
			while(s.hasMoreElements()){
				pathName = pathName + "/" + (String) s.nextElement();
				try {
					ftpClient.sendServer("MKD " + pathName + "\r\n");
				} catch (Exception e) {
					e = null;
					return false;
				}
				ftpClient.readServerResponse();
			}
			ftpClient.binary();
			return true;
		}catch (IOException e1){
			e1.printStackTrace();
			return false;
		}
	 }
	 
	 /**
	  * ftp上传
	  * 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
	  * 
	  * @param filename 要上传的文件(或文件夹)名
	  * @return
	  * @throws Exception
	  */
	public boolean upload(String filename){
		String newname = "";
		if(filename.indexOf("/") > -1){
			newname = filename.substring(filename.lastIndexOf("/") + 1);
		}else{
			newname = filename;
		}
		return upload(filename, newname);
	}
	 
	 /**
	  * ftp上传
	  * 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
	  * 
	  * @param fileName 要上传的文件(或文件夹)名
	  * @param newName 服务器段要生成的文件(或文件夹)名
	  * @return
	  */
	 public boolean upload(String fileName, String newName){
		 try{
			 String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK"); 
			 File file_in = new File(savefilename);//打开本地待长传的文件
			 if(!file_in.exists()){
				 throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
			 }
			 if(file_in.isDirectory()){
				 upload(file_in.getPath(),newName,ftpClient.pwd());
			 }else{
				 uploadFile(file_in.getPath(),newName);
			 }
			 
			 if(is != null){
				 is.close();
			 }
			 if(os != null){
				 os.close();
			 }
			 return true;
		 }catch(Exception e){ 
		  		e.printStackTrace(); 
		  		System.err.println("Exception e in Ftp upload(): " + e.toString()); 
		  		return false;
		 }finally{
			 try{
				 if(is != null){
					 is.close();
				 }
				 if(os != null){ 
					 os.close(); 
				 }
			 }catch(IOException e){
				 e.printStackTrace();
		  	} 
		 }
	 }
	 
	 /**
	  * 真正用于上传的方法
	  * @param fileName
	  * @param newName
	  * @param path
	  * @throws Exception
	  */
	 private void upload(String fileName, String newName,String path) throws Exception{
			 String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK"); 
			 File file_in = new File(savefilename);//打开本地待长传的文件
			 if(!file_in.exists()){
				 throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
			 }
			 if(file_in.isDirectory()){
				 if(!isDirExist(newName)){
					 createDir(newName);
				 }
				 ftpClient.cd(newName);
				 File sourceFile[] = file_in.listFiles();
				 for(int i = 0; i < sourceFile.length; i++){
				     if(!sourceFile[i].exists()){
				    	 continue;
				     }
				     if(sourceFile[i].isDirectory()){
				    	 this.upload(sourceFile[i].getPath(),sourceFile[i].getName(),path+"/"+newName);
				     }else{
				    	 this.uploadFile(sourceFile[i].getPath(),sourceFile[i].getName());
				      }
				    }
			 }else{
				 uploadFile(file_in.getPath(),newName);
			 }
			 ftpClient.cd(path);
	 }

	/**
	 *  upload 上传文件
	 * 
	 * @param filename 要上传的文件名
	 * @param newname 上传后的新文件名
	 * @return -1 文件不存在 >=0 成功上传,返回文件的大小
	 * @throws Exception
	 */
	public long uploadFile(String filename, String newname) throws Exception{
		long result = 0;
		TelnetOutputStream os = null;
		FileInputStream is = null;
		try {
			java.io.File file_in = new java.io.File(filename);
			if(!file_in.exists())
				return -1;
			os = ftpClient.put(newname);
			result = file_in.length();
			is = new FileInputStream(file_in);
			byte[] bytes = new byte[1024];
			int c;
			while((c = is.read(bytes)) != -1){
				os.write(bytes, 0, c);
			}
		}finally{
			if(is != null){
				is.close();
			}
			if(os != null){
				os.close();
			}
		}
		return result;
	}

	/**
	 * 从ftp下载文件到本地
	 * 
	 * @param filename 服务器上的文件名
	 * @param newfilename 本地生成的文件名
	 * @return
	 * @throws Exception
	 */
	public long downloadFile(String filename, String newfilename){
		long result = 0;
		TelnetInputStream is = null;
		FileOutputStream os = null;
		try{
			is = ftpClient.get(filename);
			java.io.File outfile = new java.io.File(newfilename);
			os = new FileOutputStream(outfile);
			byte[] bytes = new byte[1024];
			int c;
			while ((c = is.read(bytes)) != -1) {
				os.write(bytes, 0, c);
				result = result + c;
			}
		}catch (IOException e){
			e.printStackTrace();
		}finally{
			try {
				if(is != null){
						is.close();
				}
				if(os != null){
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return result;
	}

	/**
	 * 取得相对于当前连接目录的某个目录下所有文件列表
	 * 
	 * @param path
	 * @return
	 */
	public List getFileList(String path){
		List list = new ArrayList();
		DataInputStream dis;
		try {
			dis = new DataInputStream(ftpClient.nameList(this.path + path));
			String filename = "";
			while((filename = dis.readLine()) != null){
				list.add(filename);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	

	public static void main(String[] args){
		FtpUtil ftp = new FtpUtil("133.224.202.2","tstbill","tstbill");
		ftp.connectServer();
		boolean result = ftp.upload("C:/test_why", "test_why/test");
		System.out.println(result?"上传成功!":"上传失败!");
		List list = ftp.getFileList("test_why/test");
		for(int i=0;i<list.size();i++){
			String name = list.get(i).toString();
			System.out.println(name);
		}
		ftp.closeServer();
		/**
	    FTP远程命令列表
		USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT
		PASS    PASV    STOR    REST    CWD     STAT    RMD     XCUP    OPTS
		ACCT    TYPE    APPE    RNFR    XCWD    HELP    XRMD    STOU    AUTH
		REIN    STRU    SMNT    RNTO    LIST    NOOP    PWD     SIZE    PBSZ
		QUIT    MODE    SYST    ABOR    NLST    MKD     XPWD    MDTM    PROT
	    在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\r\n
	    ftpclient.sendServer("XMKD /test/bb\r\n"); //执行服务器上的FTP命令
	    ftpclient.readServerResponse一定要在sendServer后调用
	    nameList("/test")获取指目录下的文件列表
	    XMKD建立目录,当目录存在的情况下再次创建目录时报错
	    XRMD删除目录
	    DELE删除文件
		 */
	}

}

 

 

下面是FtpClient类的一些介绍:

 

sun.net.ftp.FtpClient.,该类库主要提供了用于建立FTP连接的类。利用这些类的方法,编程人员可以远程登录到FTP服务器,列举该服务器上的目录,设置传输协议,以及传送文件。FtpClient类涵盖了几乎所有FTP的功能,FtpClient的实例变量保存了有关建立"代理"的各种信息。下面给出了这些实例变量:

  public static boolean useFtpProxy
  这个变量用于表明FTP传输过程中是否使用了一个代理,因此,它实际上是一个标记,此标记若为TRUE,表明使用了一个代理主机。

 

  public static String ftpProxyHost
  此变量只有在变量useFtpProxy为TRUE时才有效,用于保存代理主机名。

 

  public static int ftpProxyPort
  此变量只有在变量useFtpProxy为TRUE时才有效,用于保存代理主机的端口地址。

 

  FtpClient有三种不同形式的构造函数,如下所示:

  1、public FtpClient(String hostname,int port)
   此构造函数利用给出的主机名和端口号建立一条FTP连接。

 

  2、public FtpClient(String hostname)
  此构造函数利用给出的主机名建立一条FTP连接,使用默认端口号。

 

  3、FtpClient()
  此构造函数将创建一FtpClient类,但不建立FTP连接。这时,FTP连接可以用openServer方法建立。

 

  一旦建立了类FtpClient,就可以用这个类的方法来打开与FTP服务器的连接。类ftpClient提供了如下两个可用于打开与FTP服务器之间的连接的方法。

  public void openServer(String hostname)
  这个方法用于建立一条与指定主机上的FTP服务器的连接,使用默认端口号。

 

  public void openServer(String host,int port)
  这个方法用于建立一条与指定主机、指定端口上的FTP服务器的连接。

 

  打开连接之后,接下来的工作是注册到FTP服务器。这时需要利用下面的方法。

  public void login(String username,String password)
  此方法利用参数username和password登录到FTP服务器。使用过Intemet的用户应该知道,匿名FTP服务器的登录用户名为anonymous,密码一般用自己的电子邮件地址。

 

  下面是FtpClient类所提供的一些控制命令。

  public void cd(String remoteDirectory):该命令用于把远程系统上的目录切换到参数remoteDirectory所指定的目录。
  public void cdUp():该命令用于把远程系统上的目录切换到上一级目录。
  public String pwd():该命令可显示远程系统上的目录状态。
  public void binary():该命令可把传输格式设置为二进制格式。
  public void ascii():该命令可把传输协议设置为ASCII码格式。
  public void rename(String string,String string1):该命令可对远程系统上的目录或者文件进行重命名操作。

 

  除了上述方法外,类FtpClient还提供了可用于传递并检索目录清单和文件的若干方法。这些方法返回的是可供读或写的输入、输出流。下面是其中一些主要的方法。

  public TelnetInputStream list()
  返回与远程机器上当前目录相对应的输入流。

 

  public TelnetInputStream get(String filename)
  获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。

 

  public TelnetOutputStream put(String filename)
  以写方式打开一输出流,通过这一输出流把文件filename传送到远程计算机。

分享到:
评论

相关推荐

    使用commons.net FTP 和sun.net.ftp.FtpClient 多种方式上传下载(包括批量)删除功能(一)

    在本文中,我们将深入探讨如何使用Apache Commons Net库和Java内置的`sun.net.ftp.FtpClient`来实现FTP(文件传输协议)的功能,包括上传、下载、批量操作以及删除文件。这两个库提供了丰富的API,使得在Java应用...

    sun.FtpClient,ftp4j.FTPClient,apache.FTPClient不同的方式操作FTP

    sun.net.ftp.FtpClient,it.sauronsoftware.ftp4j.FTPClient,org.apache.commons.net.ftp.FTPClient三种不同的方式操作FTP

    .NET下的FtpClient类

    因为开发一个项目要用到FTP上传功能,用的是.NET平台,当时找了半天也没有关于FTP...找了很多资料,并参考了一下Java的sun.net.FtpClient类,总算可以拿出来用,所以就迫不及待的传上来给大家共享,相对性能方面还可以。

    FtpClient写的java FTP工具

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 设置文件传输模式为二进制 } catch (IOException e) { e.printStackTrace(); } ``` 上传文件: ```java File localFile = new File("path/to/local/file"); ...

    java实现ftp的几种方式.doc

    Sun JDK 提供了一个简单的 FTP 客户端实现,位于 `sun.net.ftp` 包下。以下是一个基本的示例,展示了如何连接、登录 FTP 服务器以及执行 FTP 命令: ```java import sun.net.ftp.FtpClient; import sun.net.ftp...

    apache java ftpclient

    通过这些知识点,开发者可以有效地利用Apache的Java FTPClient库在Java应用中实现FTP功能,与FTP服务器进行高效、安全的文件交互。记得在实际项目中,根据需求调整配置,确保FTP操作的可靠性和安全性。

    ftp客户端算法+注解+代码

    以下是一个简单的FTP客户端实现示例,基于Java内置的`sun.net.ftp`包: ```java import sun.net.ftp.*; public class FtpUpfile { private FtpClient ftpclient; private String ipAddress; private int ipPort...

    JAVA FTP实现

    在Java中,我们可以使用不同的库来实现FTP功能,如Apache Commons Net库和内置的Java SUN FTP客户端。这两个库提供了API,使得开发者能够轻松地与FTP服务器进行交互,包括上传、下载、删除文件以及目录管理等操作。 ...

    java实现ftp的几种方式_java实现ftp的几种方式.doc

    本代码示例展示了使用 `sun.net.ftp` 包来实现 FTP 客户端功能,包括连接、断开、切换目录、创建目录、删除文件、上传文件、下载文件以及获取文件列表等操作。需要注意的是,`sun.net.ftp` 包是 Sun Microsystems ...

    java通过ftp上传下载文件

    TestFtpUpload 为示例工程 依赖的jar 里面都有 倒入到...1. 通过sun :sun.net.ftp.FtpClient 2. 通过apache:org.apache.commons.net.ftp.FTPClient 3. 通过edtftp: com.enterprisedt.net.ftp.FileTransferClient

    javaftp客户端源码.pdf

    } }}在Java中,FTP(文件传输协议)客户端的实现通常涉及使用`java.net.ftp`包中的`FtpClient`类。这个类提供了连接到FTP服务器、登录、执行FTP命令、上传和下载文件等功能。在给定的代码中,`FtpUpDown`是一个...

    如何在JAVA程序中实现FTP的功能

    在提供的代码中,使用了`sun.net.*`和`sun.net.ftp.*`这两个包,它们包含了Java对FTP协议的支持。不过需要注意的是,这些类属于Sun Microsystems的内部API,不推荐在生产环境中直接使用,因为它们可能在未来的Java...

    jdk1.7以上专用FTP工具类

    jdk1.7以上专用FTP工具类,本人花了半天时间调试通过,拿来即用,具体用法详见main函数。

    java_ftp客户端_源码

    在Java中,我们可以使用`sun.net.ftp.FtpClient`类来实现FTP(文件传输协议)客户端的功能,包括上传和下载文件。以下是一个简单的Java FTP客户端源码示例,展示了如何连接FTP服务器、执行FTP命令以及上传和下载文件...

    oracle中实现ftp文件上传下载.doc

    在提供的代码示例中,可以看到使用了`sun.net.ftp.FtpClient`类来实现FTP客户端的功能。然而,值得注意的是,`sun.net.ftp.FtpClient`并不是标准的Java API,而是Oracle JRE的一个私有实现,这意味着它可能在不同的...

    Java实现文件下载并解决中文文件名乱码

    ### Java实现文件下载并解决中文文件名乱码 在日常的Web开发中,经常会遇到需要让用户下载文件的需求,尤其是在企业级应用中。然而,在实际操作过程中可能会遇到一个常见问题:当文件名包含中文字符时,下载后的...

    在JAVA应用程序中如何实现FTP的功能 (转).txt

    - 使用`sun.net.ftp.FtpClient`类创建一个FTP客户端对象,并通过调用`openServer()`方法连接到指定的服务器。 - 登录服务器,通过调用`login()`方法,传入用户名和密码。 - 如果提供了路径,则使用`cd()`方法切换到...

    使用java开发ftp参考.pdf

    Java开发FTP客户端涉及的核心知识点包括FTP协议的基本原理、FTP客户端的设计模式、以及JBuilder9中提供的FTP库——sun.net.ftp.FtpClient的使用。以下是对这些知识点的详细说明: 1. FTP协议基础: FTP(File ...

    JAVA程序中FTP的连接以及上传文件

    import sun.net.ftp.FtpClient; public class ftptest { FtpClient ftpClient; private String localfilename; private String remotefilename; static String a = new String(); static int b; static ...

Global site tag (gtag.js) - Google Analytics