FTP上传下载(Apache Commons Net)

时间:2021-06-07 21:39:16

使用的是Apache开源包commons-net-3.3.jar,下载地址:http://commons.apache.org/proper/commons-net/download_net.cgi

FTP服务器使用Quick Easy FTP Server 4.0.0(服务器ip为192.168.31.104,端口使用默认21端口,用户名为test,密码为123)

JDK版本为1.6,Junit使用4.8.1

FTP上传工具类:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;

public class FTPutils {
	public static FTPClient getFTPClient(String ip, int port, String uName,
			String uPwd) {
		FTPClient ftpClient = new FTPClient();
		boolean result = true;
		try {
			// use port 21 by default
			// ftpClient.connect(ip);
			// use specific port
			ftpClient.connect(ip, port);
			if (ftpClient.isConnected()) {
				boolean flag = ftpClient.login(uName, uPwd);
				if (flag) {
					ftpClient.setControlEncoding("GBK");
					// binary file
					ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
				} else {
					result = false;
				}
			} else {
				result = false;
			}
			if (result) {
				return ftpClient;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public static void close(InputStream in, OutputStream out,
			FTPClient ftpClient) {
		if (null != in) {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("Input stream close error!");
			}
		}
		if (null != out) {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("Onput stream close error!");
			}
		}
		if (null != ftpClient) {
			try {
				ftpClient.logout();
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("Ftp client stream close error!");
			}
		}
	}
	
	public static boolean testUpload(String ip, int port, String uName,
			String uPwd, String fileName, String localPath, String remotePath) {
		boolean result = true;
		FileInputStream in = null;
		FTPClient ftpClient = getFTPClient(ip, port, uName, uPwd);
		if (null == ftpClient) {
			System.out.println("Get FTP client failure!");
			return false;
		}
		try {
			File file = new File(localPath + fileName);
			in = new FileInputStream(file);

			ftpClient.changeWorkingDirectory(remotePath);
			ftpClient.storeFile(fileName, in);

			return result;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		} finally {
			close(in, null, ftpClient);
		}
	}

	public static boolean testDownload(String ip, int port, String uName,
			String uPwd, String fileName, String localPath, String remotePath) {
		boolean result = true;
		FileOutputStream out = null;
		FTPClient ftpClient = getFTPClient(ip, port, uName, uPwd);
		if (null == ftpClient) {
			System.out.println("Get FTP client failure!");
			return false;
		}
		try {
			File file = new File(localPath + fileName);
			out = new FileOutputStream(file);

			ftpClient.changeWorkingDirectory(remotePath);
			ftpClient.retrieveFile(fileName, out);
			return result;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		} finally {
			close(null, out, ftpClient);
		}
	}
}

Junit测试类:

test1:上传本地e盘中up.txt文件至FTP服务器根目录下upfile文件夹中

test2:将FTP服务器根目录下downfile文件夹中的down.txt文件下载至本地e盘中

import static org.junit.Assert.*;
import org.junit.Test;

public class FTPutilsTest {
	@Test
	public void testTestUpload() {
		boolean result = FTPutils.testUpload("192.168.31.104", 21, "test", "123", 
				"up.txt", "e:\\", "/upfile");
		assertTrue(result == true);
	}

	@Test
	public void testTestDownload() {
		boolean result = FTPutils.testDownload("192.168.31.104", 21, "test", "123", 
				"down.txt", "e:\\", "/downfile");
		assertTrue(result == true);
	}
}

FTP服务器日志为:

04/11/2013 17:50:34.833 (000004)	 - (not logged in)	(192.168.31.104)>	220 Welcome to LZL's FTP Server V4.0.0
04/11/2013 17:50:34.835 (000004)	 - (not logged in)	(192.168.31.104)>	USER test
04/11/2013 17:50:34.836 (000004)	 - (not logged in)	(192.168.31.104)>	331 Password required for test
04/11/2013 17:50:34.837 (000004)	 - (not logged in)	(192.168.31.104)>	PASS 123
04/11/2013 17:50:34.839 (000004)	 - test	(192.168.31.104)>	230 Client :test successfully logged in. Client IP :192.168.31.104
04/11/2013 17:50:34.840 (000004)	 - test	(192.168.31.104)>	TYPE I
04/11/2013 17:50:34.841 (000004)	 - test	(192.168.31.104)>	200 Type set to I
04/11/2013 17:50:34.843 (000004)	 - test	(192.168.31.104)>	CWD /upfile
04/11/2013 17:50:34.843 (000004)	 - test	(192.168.31.104)>	250 "/upfile" is current directory.
04/11/2013 17:50:34.847 (000004)	 - test	(192.168.31.104)>	PORT 192,168,31,104,255,56
04/11/2013 17:50:34.852 (000004)	 - test	(192.168.31.104)>	200 Port command successful.
04/11/2013 17:50:34.853 (000004)	 - test	(192.168.31.104)>	STOR up.txt
04/11/2013 17:50:34.895 (000004)	 - test	(192.168.31.104)>	150 Opening BINARY mode data connection for file transfer.
04/11/2013 17:50:34.902 (000004)	 - test	(192.168.31.104)>	226 Transfer complete.
04/11/2013 17:50:34.903 (000004)	 - test	(192.168.31.104)>	QUIT
04/11/2013 17:50:34.904 (000004)	 - test	(192.168.31.104)>	220 Bye
04/11/2013 17:50:34.912 (000004)	 - test	(192.168.31.104)>	Client :test disconnected from 192.168.31.104
04/11/2013 17:50:34.920 (000005)	 - (not logged in)	(192.168.31.104)>	220 Welcome to LZL's FTP Server V4.0.0
04/11/2013 17:50:34.921 (000005)	 - (not logged in)	(192.168.31.104)>	USER test
04/11/2013 17:50:34.922 (000005)	 - (not logged in)	(192.168.31.104)>	331 Password required for test
04/11/2013 17:50:34.922 (000005)	 - (not logged in)	(192.168.31.104)>	PASS 123
04/11/2013 17:50:34.932 (000005)	 - test	(192.168.31.104)>	230 Client :test successfully logged in. Client IP :192.168.31.104
04/11/2013 17:50:34.948 (000005)	 - test	(192.168.31.104)>	TYPE I
04/11/2013 17:50:34.958 (000005)	 - test	(192.168.31.104)>	200 Type set to I
04/11/2013 17:50:34.974 (000005)	 - test	(192.168.31.104)>	CWD /downfile
04/11/2013 17:50:34.984 (000005)	 - test	(192.168.31.104)>	250 "/downfile" is current directory.
04/11/2013 17:50:34.994 (000005)	 - test	(192.168.31.104)>	PORT 192,168,31,104,255,59
04/11/2013 17:50:35.008 (000005)	 - test	(192.168.31.104)>	200 Port command successful.
04/11/2013 17:50:35.016 (000005)	 - test	(192.168.31.104)>	RETR down.txt
04/11/2013 17:50:35.026 (000005)	 - test	(192.168.31.104)>	150 Opening BINARY mode data connection for file transfer.
04/11/2013 17:50:35.041 (000005)	 - test	(192.168.31.104)>	226 Transfer complete.
04/11/2013 17:50:35.050 (000005)	 - test	(192.168.31.104)>	QUIT
04/11/2013 17:50:35.090 (000005)	 - test	(192.168.31.104)>	220 Bye
04/11/2013 17:50:35.116 (000005)	 - test	(192.168.31.104)>	Client :test disconnected from 192.168.31.104