在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件。
-
所用到的jar包有:
-
commons-net-1.4.1.jar
-
jakarta-oro.jar
一、上传文件
01
文件上传源代码
02
/**
03
* Description: 向FTP服务器上传文件
04
* @Version1.0
05
* @param url FTP服务器hostname
06
* @param port FTP服务器端口
07
* @param username FTP登录账号
08
* @param password FTP登录密码
09
* @param path FTP服务器保存目录
10
* @param filename 上传到FTP服务器上的文件名
11
* @param input 输入流
12
* @return 成功返回true,否则返回false
13
*/
14
public
static
boolean
uploadFile(
15
String url,
//FTP服务器hostname
16
int
port,
//FTP服务器端口
17
String username,
// FTP登录账号
18
String password,
//FTP登录密码
19
String path,
//FTP服务器保存目录
20
String filename,
//上传到FTP服务器上的文件名
21
InputStream input
// 输入流
22
) {
23
boolean
success =
false
;
24
FTPClient ftp =
new
FTPClient();
25
try
{
26
int
reply;
27
ftp.connect(url, port);
//连接FTP服务器
28
//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
29
ftp.login(username, password);
//登录
30
reply = ftp.getReplyCode();
31
if
(!FTPReply.isPositiveCompletion(reply)) {
32
ftp.disconnect();
33
return
success;
34
}
35
ftp.changeWorkingDirectory(path);
36
ftp.storeFile(filename, input);
37
38
input.close();
39
ftp.logout();
40
success =
true
;
41
}
catch
(IOException e) {
42
e.printStackTrace();
43
}
finally
{
44
if
(ftp.isConnected()) {
45
try
{
46
ftp.disconnect();
47
}
catch
(IOException ioe) {
48
}
49
}
50
}
51
return
success;
52
}
以下是文件上传的测试用例:
01
/**
02
* 将本地文件上传到FTP服务器上
03
*
04
*/
05
public
void
testUpLoadFromDisk(){
06
try
{
07
FileInputStream in=
new
FileInputStream(
new
File(
"D:/test.txt"
));
08
boolean
flag = uploadFile(
"127.0.0.1"
,
21
,
"administrator"
,
"zyuc2011"
,
"test"
,
"test.txt"
, in);
09
System.out.println(flag);
10
}
catch
(FileNotFoundException e) {
11
e.printStackTrace();
12
}
13
}
01
/**
02
* 在FTP服务器上生成一个文件,并将一个字符串写入到该文件中
03
*
04
*/
05
public
void
testUpLoadFromString(){
06
try
{
07
String str =
"这是要写入的字符串!"
;
08
InputStream input =
new
ByteArrayInputStream(str.getBytes(
"utf-8"
));
09
boolean
flag = uploadFile(
"127.0.0.1"
,
21
,
"administrator"
,
"zyuc2011"
,
"test"
,
"test.txt"
, input);
10
System.out.println(flag);
11
}
catch
(UnsupportedEncodingException e) {
12
e.printStackTrace();
13
}
14
}
二、文件下载
01
文件下载源代码
02
/**
03
* Description: 从FTP服务器下载文件
04
* @Version1.0
05
* @param url FTP服务器hostname
06
* @param port FTP服务器端口
07
* @param username FTP登录账号
08
* @param password FTP登录密码
09
* @param remotePath FTP服务器上的相对路径
10
* @param fileName 要下载的文件名
11
* @param localPath 下载后保存到本地的路径
12
* @return
13
*/
14
public
static
boolean
downFile(
15
String url,
//FTP服务器hostname
16
int
port,
//FTP服务器端口
17
String username,
//FTP登录账号
18
String password,
//FTP登录密码
19
String remotePath,
//FTP服务器上的相对路径
20
String fileName,
//要下载的文件名
21
String localPath
//下载后保存到本地的路径
22
) {
23
boolean
success =
false
;
24
FTPClient ftp =
new
FTPClient();
25
try
{
26
int
reply;
27
ftp.connect(url, port);
28
//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
29
ftp.login(username, password);
//登录
30
reply = ftp.getReplyCode();
31
if
(!FTPReply.isPositiveCompletion(reply)) {
32
ftp.disconnect();
33
return
success;
34
}
35
ftp.changeWorkingDirectory(remotePath);
//转移到FTP服务器目录
36
FTPFile[] fs = ftp.listFiles();
37
for
(FTPFile ff:fs){
38
if
(ff.getName().equals(fileName)){
39
File localFile =
new
File(localPath+
"/"
+ff.getName());
40
OutputStream is =
new
FileOutputStream(localFile);
41
ftp.retrieveFile(ff.getName(), is);
42
is.close();
43
}
44
}
45
46
ftp.logout();
47
success =
true
;
48
}
catch
(IOException e) {
49
e.printStackTrace();
50
}
finally
{
51
if
(ftp.isConnected()) {
52
try
{
53
ftp.disconnect();
54
}
catch
(IOException ioe) {
55
}
56
}
57
}
58
return
success;
59
}
以下是文件下载的测试用例:
01
/**
02
* 将FTP服务器上文件下载到本地
03
*
04
*/
05
public
void
testDownFile(){
06
try
{
07
boolean
flag = downFile(
"127.0.0.1"
,
21
,
"administrator"
,
"zyuc2011"
,
"test"
,
"test.txt"
,
"D:/"
);
08
System.out.println(flag);
09
}
catch
(Exception e) {
10
e.printStackTrace();
11
}
12
}