**
什么是FTP
**
文件传输协议(FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。
FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。
FTP 的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。它能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间,会非常长;并且不时的必须执行一些冗长的登录进程。
FTP程序
现在很多人将原本的FTP封装成立一个可直接在自己电脑上搭建的程序。我这里使用的是EasyFTP Server。他已经给分装好了,不需要自己再搭建一个服务器。
在ftp里面要设置用户,设置开放的主目
有了账号之后要给账号赋予权限,
这些都ok就可以进行下载等操作了。
下面用java程序来实现
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
public class Demo02 {
public static void main(String[] args) {
//FTP协议的客户端对象
FTPClient ftpClient=new FTPClient();
//创建文件输入流,用于读取客户端本地的文件
try (FileInputStream localIn = new FileInputStream("D:\\hpc\\图片\\爱的法则.jpg")) {
//step1:
//连接FTP服务器
ftpClient.connect("192.168.254.165",21);
//step2:
//登录
ftpClient.login("hpc", "hpc");
//step3:操作
//切换至指定目录
boolean ischange=ftpClient.changeWorkingDirectory("wyj");
System.out.println("切换目录1:"+ischange);
if(!ischange) {
ftpClient.makeDirectory("wyj");
ischange=ftpClient.changeWorkingDirectory("wyj");
}
System.out.println("切换目录2:"+ischange);
//日期转换格式
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();
}
//存储文件(将本地文件上传至FTP服务器)
//参数1:FTP服务器的存储位置(目录+文件名)
//参数2:本地的文件输入流
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //存储前设置文件类型
boolean b=ftpClient.storeFile("love.jpg", 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服务器指定目录的某个文件
FTPClient ftpClient=new FTPClient();
try (FileOutputStream out = new FileOutputStream("d:\\hpc\\love.jpg")) {
ftpClient.connect("192.168.254.165",21); //连接
ftpClient.login("hpc", "hpc"); //登录
ftpClient.changeWorkingDirectory("wyj"); //切换目录
//下载文件(获取FTP服务器指定目录(wyj)的文件)
//参数1:服务器指定文件
//参数2:本地输出流(负责下载后写入)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
boolean isretrieve=ftpClient.retrieveFile("love.jpg", out);
System.out.println("下载成功?:"+isretrieve);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}