`
to_zoe_yang
  • 浏览: 143300 次
  • 性别: Icon_minigender_2
  • 来自: 01
社区版块
存档分类
最新评论

(转载+学习)FTP客户端(利用sun.net.ftp.FtpClient实现)

阅读更多

服务器端我使用Server-U
不错~
很好用~
现在打算自己写个完整的客户端了

package 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 {
			System.out.println("准备上传...");
			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()) {
				System.out.println("即将上传的是目录");
				upload(file_in.getPath(), newName, ftpClient.pwd());
			} else {
				System.out.println("即将上传的是文件");
				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;
			System.out.println(filename+"存在");
			os = ftpClient.put(newname);
			System.out.println("传送");
			result = file_in.length();
			is = new FileInputStream(file_in);
			byte[] bytes = new byte[1024];
			int c;
			System.out.println("即将传送...");
			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("localhost", "zoe_yang", "347073999");
		ftp.connectServer();
		boolean result = ftp.upload("F:/PowerStation.xml", "PowerStation.xml");
		System.out.println(result ? "上传成功!" : "上传失败!");
		List list = ftp.getFileList("test_why");
		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删除文件 
		 */
	}

}
分享到:
评论
1 楼 ncx1259988 2011-08-17  
兄弟,请问测试过没,在A电脑部署了项目和FTP服务器,然后到B电脑去访问项目下载服务器上面的文件,是否可以下载到B电脑上面,我现在的下载问题是不能下载到客户端去,我项目部署在A电脑上面,然后到B电脑下载文件,可以下载的文件还是在A电脑!

相关推荐

    使用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工具

    这个库提供了丰富的API,使得开发者能够轻松地实现FTP(文件传输协议)客户端的功能,包括上传、下载、删除文件,以及创建、删除目录等操作。下面将详细介绍`FtpClient`在Java中的应用及其主要功能。 首先,`...

    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服务器进行交互,包括上传、下载、删除文件以及目录管理等操作。 ...

    javaftp客户端源码.pdf

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

    java_ftp客户端_源码

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

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

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

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

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

    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

    jdk1.7以上专用FTP工具类

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

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

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

    在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实现文件下载并解决中文文件名乱码

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

    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