文件传输协议(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)下载指定文件