FTP上传下载(Apache Commons Net)

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

使用的是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