文件传输协议(File Transfer Protocol,FTP)是一种提供网络之间共享文件的协议。它可以在计算机之间可靠、高效地传送文件。在传输时,传输双方的操作系统、磁盘文件系统类型可以不同。
FTP协议允许TCP/IP网络上的两台计算机之间进行文件传输。而FTP服务是基于FTP协议的文件传输服务。工作时,一台计算机上运行FTP客户端应用程序,另一台计算机上需要运行FTP服务器端程序。只有拥有了FTP服务,客户端才能进行文件传输。下面介绍FTP服务的构成和文件传输模式。
1、FTP服务构成
文件传输,指的是客户端和FTP服务器端之间的文件传输,如文件上传和下载。要实现文件传输还需要满足两个条件,如下:
1)服务器端必须开启一个TCP端口(默认为21端口),用来监听来自客户端的请求。
2)客户端连接FTP服务器端,需要使用TCP方式。这样可以保证客户端和服务器之间的会话是可靠的。
客户端与FTP服务器端之间传输一个文件是一次完整的FTP会话。该会话包含有两个连接,分别为控制连接和数据连接。其作用如下:
控制连接:客户端向FTP服务器的21端口发送连接,服务器接受连接,建立一条命令通道。FTP的命令和应答就是通过控制连接来传输的,这个连接会存在于整个FTP会话过程中。该连接主要负责将命令从客户端传给服务器,并将服务器的应答返回给客户端。所以,该连接不用于发送数据,只用于传输命令。
数据连接:每当一个文件在客户端与服务器之间进行传输时,就会创建数据连接。该连接主要用来进行文件传输。
接下来分为两部分代码:
(1)传输以及查案已有文件图片
import java.io.FileInputStream;
import java.io.IOException;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPListParseEngine;
public class Demo01 {
public static void main(String[] args) {
FTPClient ftpClient = new FTPClient();
try(FileInputStream in = new FileInputStream("C:\\Users\\Guo\\Desktop\\123456.gif")) {
//第一步:连接ftp服务器并验证用户名密码
ftpClient.connect("192.168.254.xxx",21);
ftpClient.login("admin1","123456");
//第二步:
boolean isChange = ftpClient.changeWorkingDirectory("ludatou");
if(isChange) {
SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日");
//获取当前目录的所有文件
FTPFile[] ftpFileList = ftpClient.listFiles();
for(FTPFile file : ftpFileList) {
String fileName = file.getName();
fileName = new String(fileName.getBytes("iso-8859-1"),"gb2312");
System.out.println("文件名称:"+ fileName);
Date creatDate = file.getTimestamp().getTime();
System.out.println("创建时间:"+ fmt.format(creatDate));
System.out.println("文件大小:"+ file.getSize()+"字节");
}
}
else {
//创建指定目录
ftpClient.makeDirectory("ludatou");
}
//第三步:文件上穿
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型
//存文件至FTP服务器
//参数1:FTP文件的保存名称
//参数2:本地文件输入流
boolean isStore = ftpClient.storeFile(System.currentTimeMillis()+".jpg", in);
System.out.println("文件上传成功?"+ isStore);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
String fileName = file.getName();
fileName = new String(fileName.getBytes("iso-8859-1"),"gb2312");
System.out.println("文件名称:"+ fileName);
Date creatDate = file.getTimestamp().getTime();
System.out.println("创建时间:"+ fmt.format(creatDate));
System.out.println("文件大小:"+ file.getSize()+"字节");
通过这几行代码,你可以查收到文件的名称,大小以及创建时间。。。
其中若搜不到查询的文件,便会自己创建一个需要寻额文件,并可以往里面存放文件!
(2)文件的下载:、
//基于FTP协议的文件下载
public class Demo02 {
public static void main(String[] args) {
//创建基于FTP协议访问文件服务器的客户端对象
FTPClient ftpClient = new FTPClient();
try(FileOutputStream out = new FileOutputStream("E:\\test\\test\\"+System.currentTimeMillis()+".jpg")){
//第1步:连接FTP服务器并验证用户名密码
ftpClient.connect("192.168.254.xxx",21);
ftpClient.login("lyj", "123");
//第2步:切换至个人目录
boolean isChange = ftpClient.changeWorkingDirectory("luyujiang");
//第3步:下载指定文件
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//文件类型
boolean isRetrieve = ftpClient.retrieveFile("fjq.jpg", out);
System.out.println("下载成功?"+isRetrieve);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//断开连接
try {
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
ftpClient = null;
}
}
}
}
下载文件主要步骤://第1步:连接FTP服务器并验证用户名密码
//第2步:切换至个人目录
//第3步:下载指定文件
最后切记需要断开连接,以便于他人的进入!!!
最后又是道别的时间了,如果这篇文章对你有用,记得一键三连支持二锅头哦!!!