本文主要介绍如何使用Apache工具集commons-net提供的ftp工具实现向ftp服务器上传和下载文件。
一、准备
需要引用commons-net-3.5.jar包。
使用maven导入:
1
2
3
4
5
|
< dependency >
< groupId >commons-net</ groupId >
< artifactId >commons-net</ artifactId >
< version >3.5</ version >
</ dependency >
|
二、连接FTP Server
java" id="highlighter_398421">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
/**
* 连接FTP Server
* @throws IOException
*/
public static final String ANONYMOUS_USER= "anonymous" ;
private FTPClient connect(){
FTPClient client = new FTPClient();
try {
//连接FTP Server
client.connect( this .host, this .port);
//登陆
if ( this .user== null || "" .equals( this .user)){
//使用匿名登陆
client.login(ANONYMOUS_USER, ANONYMOUS_USER);
} else {
client.login( this .user, this .password);
}
//设置文件格式
client.setFileType(FTPClient.BINARY_FILE_TYPE);
//获取FTP Server 应答
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)){
client.disconnect();
return null ;
}
//切换工作目录
changeWorkingDirectory(client);
System.out.println( "===连接到FTP:" +host+ ":" +port);
}
catch (IOException e){
return null ;
}
return client;
}
/**
* 切换工作目录,远程目录不存在时,创建目录
* @param client
* @throws IOException
*/
private void changeWorkingDirectory(FTPClient client) throws IOException{
if ( this .ftpPath!= null &&! "" .equals( this .ftpPath)){
Boolean ok = client.changeWorkingDirectory( this .ftpPath);
if (!ok){
//ftpPath 不存在,手动创建目录
StringTokenizer token = new StringTokenizer( this .ftpPath, "\\//" );
while (token.hasMoreTokens()){
String path = token.nextToken();
client.makeDirectory(path);
client.changeWorkingDirectory(path);
}
}
}
}
/**
* 断开FTP连接
* @param ftpClient
* @throws IOException
*/
public void close(FTPClient ftpClient) throws IOException{
if (ftpClient!= null && ftpClient.isConnected()){
ftpClient.logout();
ftpClient.disconnect();
}
System.out.println( "!!!断开FTP连接:" +host+ ":" +port);
}
|
host:ftp服务器ip地址
port:ftp服务器端口
user:登陆用户
password:登陆密码
登陆用户为空时,使用匿名用户登陆。
ftpPath:ftp路径,ftp路径不存在时自动创建,如果是多层目录结构,需要迭代创建目录。
三、上传文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
/**
* 上传文件
* @param targetName 上传到ftp文件名
* @param localFile 本地文件路径
* @return
*/
public Boolean upload(String targetName,String localFile){
//连接ftp server
FTPClient ftpClient = connect();
if (ftpClient== null ){
System.out.println( "连接FTP服务器[" +host+ ":" +port+ "]失败!" );
return false ;
}
File file = new File(localFile);
//设置上传后文件名
if (targetName== null || "" .equals(targetName))
targetName = file.getName();
FileInputStream fis = null ;
try {
long now = System.currentTimeMillis();
//开始上传文件
fis = new FileInputStream(file);
System.out.println( ">>>开始上传文件:" +file.getName());
Boolean ok = ftpClient.storeFile(targetName, fis);
if (ok){
//上传成功
long times = System.currentTimeMillis() - now;
System.out.println(String.format( ">>>上传成功:大小:%s,上传时间:%d秒" , formatSize(file.length()),times/ 1000 ));
} else //上传失败
System.out.println(String.format( ">>>上传失败:大小:%s" , formatSize(file.length())));
}
catch (IOException e){
System.err.println(String.format( ">>>上传失败:大小:%s" , formatSize(file.length())));
e.printStackTrace();
return false ;
}
finally {
try {
if (fis!= null )
fis.close();
close(ftpClient);
}
catch (Exception e){
}
}
return true ;
}
|
四、下载文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
/**
* 下载文件
* @param localPath 本地存放路径
* @return
*/
public int download(String localPath){
// 连接ftp server
FTPClient ftpClient = connect();
if (ftpClient== null ){
System.out.println( "连接FTP服务器[" +host+ ":" +port+ "]失败!" );
return 0 ;
}
File dir = new File(localPath);
if (!dir.exists())
dir.mkdirs();
FTPFile[] ftpFiles = null ;
try {
ftpFiles = ftpClient.listFiles();
if (ftpFiles== null ||ftpFiles.length== 0 )
return 0 ;
}
catch (IOException e){
return 0 ;
}
int c = 0 ;
for ( int i= 0 ;i<ftpFiles.length;i++){
FileOutputStream fos = null ;
try {
String name = ftpFiles[i].getName();
fos = new FileOutputStream( new File(dir.getAbsolutePath()+File.separator+name));
System.out.println( "<<<开始下载文件:" +name);
long now = System.currentTimeMillis();
Boolean ok = ftpClient.retrieveFile( new String(name.getBytes( "UTF-8" ), "ISO-8859-1" ), fos);
if (ok){
//下载成功
long times = System.currentTimeMillis() - now;
System.out.println(String.format( "<<<下载成功:大小:%s,上传时间:%d秒" , formatSize(ftpFiles[i].getSize()),times/ 1000 ));
c++;
} else {
System.out.println( "<<<下载失败" );
}
}
catch (IOException e){
System.err.println( "<<<下载失败" );
e.printStackTrace();
}
finally {
try {
if (fos!= null )
fos.close();
close(ftpClient);
}
catch (Exception e){
}
}
}
return c;
}
|
格式化文件大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
private static final DecimalFormat DF = new DecimalFormat( "#.##" );
/**
* 格式化文件大小(B,KB,MB,GB)
* @param size
* @return
*/
private String formatSize( long size){
if (size< 1024 ){
return size + " B" ;
} else if (size< 1024 * 1024 ){
return size/ 1024 + " KB" ;
} else if (size< 1024 * 1024 * 1024 ){
return (size/( 1024 * 1024 )) + " MB" ;
} else {
double gb = size/( 1024 * 1024 * 1024 );
return DF.format(gb)+ " GB" ;
}
}
|
五、测试
1
2
3
4
5
6
|
public static void main(String args[]){
FTPTest ftp = new FTPTest( "192.168.1.10" , 21 , null , null , "/temp/2016/12" );
ftp.upload( "newFile.rar" , "D:/ftp/TeamViewerPortable.rar" );
System.out.println( "" );
ftp.download( "D:/ftp/" );
}
|
结果
1
2
3
4
5
6
7
8
9
|
===连接到FTP: 192.168 . 1.10 : 21
>>>开始上传文件:TeamViewerPortable.rar
>>>上传成功:大小: 5 MB,上传时间: 3 秒
!!!断开FTP连接: 192.168 . 1.10 : 21
===连接到FTP: 192.168 . 1.10 : 21
<<<开始下载文件:newFile.rar
<<<下载成功:大小: 5 MB,上传时间: 4 秒
!!!断开FTP连接: 192.168 . 1.10 : 21
|
总结
以上就是本文关于java使用Apache工具集实现ftp文件传输代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/zleven/article/details/53886764