前言
FTP协议是文件传输协议,是一种基于TCP/IP协议的协议,他包括FTP服务器和FTP客户端;FTP服务器用来储存文件,FTP客户端需通过FTP协议对服务器进行访问,FTP服务器通常不需要我们手动编写,而是借助于已经成熟的FTP服务器程序,基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"和"上传"。 "下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。
FTP服务器
在这里我们采用服务器模拟工具EasyFtp,他是一个基于Wininet函数库基础上的Ftp上传工具软件;
下载完成后,启动EasyFtp工具,并且创建账号:
注:必需要对想要客户端进行什么操作的权限进行设置
在浏览器中访问FTP服务器:
基于Java编写FTP客户端
在这里,我们采用Apache的 common-net ,common-net 是 commos 顶级项目下一个非常强大的用于网络编程的子项目:
上传文件
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
public class Test01 {
public static void main(String[] args) {
//FTP协议的客户端对象
FTPClient ftpClient=new FTPClient();
//创建文件输入流,用于读取客户端本地的文件
try (FileInputStream localIn = new FileInputStream("D://1627356545598.xlsx")) {
//step1:
//连接FTP服务器
ftpClient.connect("192.168.254.107",21);
//step2:
//登录
ftpClient.login("admin", "admin");
//step3:操作
//切换至指定目录
boolean ischange=ftpClient.changeWorkingDirectory("download");
if(!ischange) {
ftpClient.makeDirectory("download");
ischange=ftpClient.changeWorkingDirectory("download");
}
//存储文件(将本地文件上传至FTP服务器)
//参数1:FTP服务器的存储位置(目录+文件名)
//参数2:本地的文件输入流
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //存储前设置文件类型
boolean b=ftpClient.storeFile("11111.xlsx", localIn); //存储
System.out.println(b);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//最后关闭
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
上传结果:
从服务器上下载文件
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
public class Demo03 {
public static void main(String[] args) {
//下载FTP服务器指定目录的某个文件
String filename="11111.xlsx";
FTPClient ftpClient=new FTPClient();
try (FileOutputStream out = new FileOutputStream("D:\\琐碎\\"+filename)) {
ftpClient.connect("192.168.254.107",21); //连接
ftpClient.login("admin", "admin"); //登录
ftpClient.changeWorkingDirectory("download"); //切换目录
//下载文件(获取FTP服务器指定目录(wyj)的文件)
//参数1:服务器指定文件
//参数2:本地输出流(负责下载后写入)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
boolean isretrieve=ftpClient.retrieveFile(filename, out);
System.out.println("下载成功?:"+isretrieve);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
下载结果:
common-net还提供了其他方法,对FTP服务器的文件进行查看:
//日期转换格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//获取该目录下的所有文件
FTPFile[] files=ftpClient.listFiles();
for(FTPFile f:files) {
System.out.println("文件名称:"+f.getName());
//获取文件创建时间
Date crateDate=f.getTimestamp().getTime();
//日期格式化
String crateDateStr=sdf.format(crateDate);
System.out.println("创建时间:"+crateDateStr);
//文件大小
System.out.println("文件大小:"+f.getSize());
//上传用户
System.out.println("上传用户:"+f.getUser());
System.out.println();
}