当前位置:网站首页>基于ftp协议的上传与下载
基于ftp协议的上传与下载
2022-08-08 10:19:00 【吧唧!】
FTP协议的理解
ftp协议:就是文件传输协议,是一种基于TCP/IP的应用层协议。包含FTP服务器和FTP客户端两部分。FTP客户端需通过‘FTP协议’对服务器进行访问,其中FTP服务器用来存储文件,用于在Internet上的控制文件的双向传输。
FTP的工作模式
在进行ftp操作时,首先需要保证远程服务器端的通信状态,在远程服务器中执行FTP服务器应用程序,使服务器处于等待被连接的状态;这样,就可以通过自己的FTP客户端和FTP服务器进行连接通信。
FTP的服务器
FTP服务器使用两个端口,分别为控制端口(命令端口)和数据端口。控制端口号一般为21,数据端口一般为20。控制socket用来传输命令,数据socket用来传输数据。每一个FTP命令发送后,FTP服务器就会返回一个字符串,其中包含一个响应码和一些说明信息,其中响应码主要用于判断命令是否被成功执行了。
服务器端需创建一个用户,设置用户名并设置指定服务器用户对应的本地文件目录,以及设置客户端对自己的访问权限。
上传文件至ftp服务器
1、首先创建FTP协议的客户端对象
FTPClient ftpClient = new FTPClient();
2、连接FTP服务器
// 传入客户端自己的IP地址以及服务器端口号
ftpClient.connect("192.168.137.1", 21);
3、登录,通过传入服务器的用户名和密码
ftpClient.login("root", "root");
4、将本地文件上传优化步骤:为了便于上传,我们可以做一个切换目录的操作,可以切换至我们指定的目录或创建的新目录下
if (!ftpClient.changeWorkingDirectory("upload")) {
//如果目录不存在切换不成功 创建新目录
ftpClient.makeDirectory("upload");
//切换到新目录
ftpClient.changeWorkingDirectory("upload");
}
切换完目录后,我们需要指定上传文件的存储类型然后再上传。
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //存储前设置文件类型
// 要上传的文件
File tempExcelFile = new File("本地文件路径");
// 通过输入流包装
FileInputStream in = new FileInputStream(tempExcelFile)
// 使用storeFIle方法上传,存储至ftp服务器
ftpClient.storeFile(tempExcelFile.getName(), in);
//最后记得要手动断开连接
文件上传至ftp的完整过程
//创建ftp客户端对象
FTPClient ftpClient=new FTPClient();
//创建输入流,读取本地文件
try(InputStream localIn=new FileInputStream("c://text//Du.jpg")) {
//连接服务器
ftpClient.connect("192.168.254.185",21);
ftpClient.login("root", "root");//登录
//切换至指定目录
boolean isChange=ftpClient.changeWorkingDirectory("du");
if(!isChange) {
//判断是否切换成功
ftpClient.makeDirectory("du");//切换不成功,创建目录
ftpClient.changeWorkingDirectory("du");//创建结束,再次切换
}
//设置上传文件的类型
boolean isok=ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//存储(上传后的存储名称,本地的输入流)
ftpClient.storeFile("Du.jpg", localIn);
//查看是否上传成功
System.out.println(isok);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
ftpClient.disconnect();//断开连接
} catch (IOException e) {
e.printStackTrace();
}
}
FTP服务器下载文件
下载和上传类似,同样的是先进行连接、登录、设置文件类型,最后下载,直接看具体过程8️⃣:
String loadimage="zhou.jpg";//服务器指定的文件
//创建对象FTP服务器
FTPClient ftp=new FTPClient();
try(FileOutputStream out=new FileOutputStream("c://text//TYQ//imageeeeee.png")) {
ftp.connect("192.168.254.176",21);//连接
ftp.login("root", "root");//登录
ftp.changeWorkingDirectory("bb");//切换目录
//下载文件
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型
//参数1:服务器指定文件
//参数2:本地输出流(作用:负责下载后写入本地)
boolean isok=ftp.retrieveFile(loadimage,out );//下载
System.out.println("文件是否下载成功:"+isok);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
ftp.disconnect(); //也需要断开连接
} catch (IOException e) {
e.printStackTrace();
}
}
获取ftp服务器指定目录的文件
除了上传和下载,我们还可以通过服务器与客户端的连接,获取服务器的一些指定文件,并查看文件的属性信息等。但基本操作和上传下载一样,都需要创建ftp对象,连接,登录,切换至指定目录,然后我们就可获取该目录下的文件,通过遍历,我们可以获得文件的基本属性和信息。
//创建ftp客户端对象
FTPClient ftp=new FTPClient();
try {
//建立连接dir01
ftp.connect("192.168.254.185",21);
ftp.login("root", "root");//登录
//切换工作目录至
boolean isChangge=ftp.changeWorkingDirectory("dir01");
System.out.println(isChangge);
//获取该目录下所有文件
FTPFile[] files=ftp.listFiles();
//日期格式化
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//遍历该文件数组的每个文件,并得到文件的部分信息
for(FTPFile f:files) {
System.out.println("文件名称:"+f.getName());
System.out.println("文件大小:"+f.getType());
//文件创建时间
Date create=f.getTimestamp().getTime();
//日期格式化
String dateStr=sdf.format(create);
System.out.println("文件创建时间:"+dateStr);
System.out.println("上传用户:"+f.getUser());
System.out.println();
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
边栏推荐
- Jingkai Safety Supervision App technical service support
- 左益豪:用代码创造一个新世界|OneFlow U
- 便利贴--48{再次,适配屏幕宽高class}
- 2G 3G 4G 5G 基站覆盖范围
- .net开发中,C# DateTime.Now 取出的时间含有星期解决办法
- NoSQL有哪些特点呢?
- 使用.NET简单实现一个Redis的高性能克隆版(三)
- 文档数据库是用来干什么的呢?
- "Weekly Translate Go" This time we have something different!-- "How to Code in Go" series launched
- ReentrantLock源码分析和使用案例
猜你喜欢
功夫再高也怕菜刀,产品经理的那些事
Recommend 100 nice English songs
高并发下秒杀商品,你必须知道的9个细节
01-MQ介绍以及产品比较
2022 world conference on robots is holding, intelligent robot booster to intelligent, digital transformation and upgrading traditional industry
经开安监App技术服务支持
"Inversion of Control" and "Dependency Inversion", can't you tell the difference?
【数学知识】—— 质数/约数
使用类似搭积木的低代码开发方式进行 SAP API 开发
Feign应用及源码剖析
随机推荐
Apple developer account application process full version
Loadrunner12.0.2 installation and Chinese language pack installation (Chinese)
关于振弦采集模块及采集仪振弦频率值准确率的问题
小程序使用formdata格式传参
Jingkai Safety Supervision App technical service support
Service Mesh迁移原则
Redis 定长队列的探索和实践
3D激光SLAM:LIO-SAM整体介绍与安装编译
利用图像二维熵实现视频信号丢失检测(Signal Loss Detection)
卫星互联网真能替代 5G?
高并发下秒杀商品,你必须知道的9个细节
移动端/嵌入式-CV模型-2017:MobelNets-v1
列存储数据库是通过什么来定位的呢?
图数据库是使用什么作为数据模型的呢?
go web之响应用户
dedecms支持Word图文一键导入
vs2019+boost库(boost_1_67_0)安装
文档数据库和列存储数据库有什么不同的嘛?
Using classification weights, it is easy to solve the problem of data imbalance
分布式系统设计策略