用Java实现FTP

        文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。

        FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。

1、首先我们需要手动创建一个FTP服务器,使用easyftp-server来手动创建

 

创建完成以后我们就可以通过 主机IP和FTP服务端口来访问我们的文件

2、其次需要导入一个相关的jar包:commons-net-3.6.jar

然后我们就可以开始编写代码来访问这个我们自己创建的FTP服务器

案例一:查看指定目录的文件信息

public static void main(String[] args) {

		FTPClient ftpClient = new FTPClient();

		try {

			// 连接FTP服务器并且验证用户名和密码
			ftpClient.connect("192.168.254.116", 21);
			ftpClient.login("ddc", "123456");

			// 查看是否存在对应的目录
			boolean isChange = ftpClient.changeWorkingDirectory("lizhihui");

			if (isChange) {
				// 目录存在 显示该目录的内容
				FTPFile[] FTPFileList = ftpClient.listFiles();

				// 处理日期格式
				SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");

				for (FTPFile ftp : FTPFileList) {
					// 处理乱码
					String name = ftp.getName();
					name = new String(name.getBytes("iso-8859-1"), "gb2312");
					System.out.println("文件名称:" + name);
					Date date = ftp.getTimestamp().getTime();
					System.out.println("创建时间:" + fmt.format(date));
					System.out.println("文件大小:" + ftp.getSize());
					System.out.println();
				}
			} else {
				ftpClient.makeDirectory("lizhihui");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 断开连接
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
				ftpClient = null;
			}
		}
	}

1、先创建一个FTPClient对象,代表我们的客户端;

2、然后连接FTP服务器并且验证用户名和密码;

3、通过ftpClient.changeWorkingDirectory来查看是否存在我们需要的目录,存在就访问并且获取目录的信息内容,否则创建这个目录;

4、最后断开连接。

在访问过程中,需要处理相关的问题,例如中文乱码,时间格式等

案例二:上传文件到指定目录

public static void main(String[] args) {
		FTPClient ftpClient = new FTPClient();

		try (InputStream in = new FileInputStream(new File("D:\\java\\ddc.jpg"))) {

			// 连接FTP服务器并且验证用户名和密码
			ftpClient.connect("192.168.254.116", 21);
			ftpClient.login("ddc", "123456");

			// 查看是否存在对应的目录
			boolean isChange = ftpClient.changeWorkingDirectory("lizhihui");

			if (!isChange) {
				// 创建个人目录
				ftpClient.makeDirectory("lizhihui");
				// 切换
				ftpClient.changeWorkingDirectory("lizhihui");
			}

			// 文件类型
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

			boolean is = ftpClient.storeFile(System.currentTimeMillis() + ".jpg", in);
			System.out.println(is);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

1、需要将上传的文件以流的方式引入;

2、通过ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);指定文件类型;

3、最后使用ftpClient.storeFile上传文件,他需要两个参数,第一个参数为文件名称,第二个参数为我们引入的文件流。

案例三:下载文件到指定目录

public static void main(String[] args) {

		FTPClient ftpClient = new FTPClient();

		try (OutputStream out = new FileOutputStream(new File("D:\\java\\" + System.currentTimeMillis() + ".jpg"))) {
			ftpClient.connect("192.168.254.123", 21);
			ftpClient.login("admin", "123456");

			boolean isChange = ftpClient.changeWorkingDirectory("liubin");

			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 下载指定文件
			boolean isd = ftpClient.retrieveFile("3.jpg", out);
			System.out.println(isd);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 断开连接
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
				ftpClient = null;
			}
		}
	}

需要创建一个输出流,写入下载的文件,通过ftpClient.retrieveFile("3.jpg", out)下载指定文件

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农叮叮车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值