Java 实现FTP服务实例详解

时间:2022-01-04 03:54:48

Java 实现FTP服务实例详解

1、FTP简介

        FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

2、实例

2.1、添加依赖

?
1
2
3
4
5
<!-- 文件上传组件 -->
 <dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
 </dependency>

2.2测试类

?
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
package testController;
 
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.chenzhengyou.common.util.FtpUtil;
import org.junit.Test;
 
import java.io.File;
import java.io.FileInputStream;
 
/**
 * @auther 陈郑游
 * @create 2016-11-23-19:27
 * @功能描述 图片测试
 * @公司地址
 */
 
public class FtpController {
 
  //主机地址 端口号
  private String HOSTNAME = "127.0.0.1";
  private Integer PORT = 21;
  //本地图片路径
  private String FilePackage = "F:\\Programming_Package\\IMG_3733_1.JPG";
 
  //用户名 密码
  private String USERNAME = "czy";
  private String PASSWORD = "czy";
 
  /**
   * 无工具类图片测试
   * */
  @Test
  public void testFtp() throws Exception {
    //创建一个FtpClient对象
    FTPClient ftpClient = new FTPClient();
    //创建ftp连接。默认是21端口
    ftpClient.connect(HOSTNAME,PORT);
    //登录ftp服务器,使用用户名和密码
    ftpClient.login(USERNAME,PASSWORD);
    //上传文件。
    //读取本地文件
    FileInputStream inputStream = new FileInputStream(new File(FilePackage));
    //设置上传的路径
    ftpClient.changeWorkingDirectory("/myftp/images");
    //修改上传文件的格式
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    //第一个参数:服务器端文档名
    //第二个参数:上传文档的inputStream
    ftpClient.storeFile("hello.jpg", inputStream);
    //关闭连接
    ftpClient.logout();
  }
}

2.3、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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package org.chenzhengyou.common.util;
 
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
 
import java.io.*;
 
/**
 * @auther 陈郑游
 * @create 2016-11-23-19:27
 * @功能描述 ftp工具类
 * @公司地址
 */
public class FtpUtil {
 
  /**
   * Description: 向FTP服务器上传文件
   * @param host FTP服务器hostname
   * @param port FTP服务器端口
   * @param username FTP登录账号
   * @param password FTP登录密码
   * @param basePath FTP服务器基础目录
   * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
   * @param filename 上传到FTP服务器上的文件名
   * @param input 输入流
   * @return 成功返回true,否则返回false
   */
  public static boolean uploadFile(String host, int port, String username,
                   String password, String basePath,
      String filePath, String filename, InputStream input) {
 
    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
      int reply;
      ftp.connect(host, port);// 连接FTP服务器
      // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
      ftp.login(username, password);// 登录
      reply = ftp.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        return result;
      }
      //切换到上传目录
      if (!ftp.changeWorkingDirectory(basePath+filePath)) {
        //如果目录不存在创建目录
        String[] dirs = filePath.split("/");
        String tempPath = basePath;
        for (String dir : dirs) {
          if (null == dir || "".equals(dir)) continue;
          tempPath += "/" + dir;
          if (!ftp.changeWorkingDirectory(tempPath)) {
            if (!ftp.makeDirectory(tempPath)) {
              return result;
            } else {
              ftp.changeWorkingDirectory(tempPath);
            }
          }
        }
      }
      //设置上传文件的类型为二进制类型
      ftp.setFileType(FTP.BINARY_FILE_TYPE);
      //上传文件
      if (!ftp.storeFile(filename, input)) {
        return result;
      }
      input.close();
      ftp.logout();
      result = true;
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (ftp.isConnected()) {
        try {
          ftp.disconnect();
        } catch (IOException ioe) {
        }
      }
    }
    return result;
  }
   
  /**
   * Description: 从FTP服务器下载文件
   * @param host FTP服务器hostname
   * @param port FTP服务器端口
   * @param username FTP登录账号
   * @param password FTP登录密码
   * @param remotePath FTP服务器上的相对路径
   * @param fileName 要下载的文件名
   * @param localPath 下载后保存到本地的路径
   * @return
   */
  public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
      String fileName, String localPath) {
    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
      int reply;
      ftp.connect(host, port);
      // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
      ftp.login(username, password);// 登录
      reply = ftp.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        return result;
      }
      ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
      FTPFile[] fs = ftp.listFiles();
      for (FTPFile ff : fs) {
        if (ff.getName().equals(fileName)) {
          File localFile = new File(localPath + "/" + ff.getName());
 
          OutputStream is = new FileOutputStream(localFile);
          ftp.retrieveFile(ff.getName(), is);
          is.close();
        }
      }
 
      ftp.logout();
      result = true;
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (ftp.isConnected()) {
        try {
          ftp.disconnect();
        } catch (IOException ioe) {
        }
      }
    }
    return result;
  }
}

实现类

?
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
package testController;
 
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.chenzhengyou.common.util.FtpUtil;
import org.junit.Test;
 
import java.io.File;
import java.io.FileInputStream;
 
/**
 * @auther 陈郑游
 * @create 2016-11-23-19:27
 * @功能描述 图片测试
 * @公司地址
 */
 
public class FtpController {
 
  //主机地址 端口号
  private String HOSTNAME = "127.0.0.1";
  private Integer PORT = 21;
  //本地图片路径
  private String FilePackage = "F:\\Programming_Package\\IMG_3733_1.JPG";
 
  //用户名 密码
  private String USERNAME = "czy";
  private String PASSWORD = "czy";
 
  /**
   * 有工具类测试
   * */
  @Test
  public void testUtil() throws Exception {
    FileInputStream inputStream = new FileInputStream(new File("F:\\Programming_Package\\IMG_3733_1.JPG"));
    FtpUtil.uploadFile(HOSTNAME,PORT, USERNAME, PASSWORD, "/myftp/images", "/2016/11/24", "hello.jpg", inputStream);
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/javawe*ie/article/details/62439276