java使用Apache工具集实现ftp文件传输代码详解

时间:2022-06-24 11:14:38

本文主要介绍如何使用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