版本
- Linux为CentOS7.x
- Java为jdk8
FTP
准备东西
准备要的东西
1、在对应linux上安装ftp(vsftpd) 安装vsftpd文章
2、Linux创建ftp用户
-
useradd 账号 passwd 账号 #(回车)给用户设置登录密码 --输入两遍、注意输入密码是不会显示、输入正确回车就行 userdel 账号 -- 删除 tail /etc/passwd -- 查看所有账号 复制代码
2、创建项目
3、导入对应依赖!!!
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.8.0</version>
</dependency>
复制代码
创建测试类
上代码:简单的原生commons-net
来获取ftp连接
public class FTPUtil {
public static void main(String[] args) throws IOException {
FTPClient ftp = null;
try {
ftp = getFTPClient();
System.out.println(ftp);
}catch (Exception e){
e.printStackTrace();
}finally {
if (ftp !=null) {
// 断开连接
ftp.logout();
}
}
}
public static FTPClient getFTPClient() {
FTPClient ftp = null;
try {
ftp = new FTPClient();
// 连接FPT服务器,设置IP及端口
ftp.connect("",21);
// 设置用户名和密码
ftp.login("", "");
// 设置连接超时时间,5000毫秒
ftp.setConnectTimeout(5000);
// 设置中文编码集,防止中文乱码
ftp.setControlEncoding("UTF-8");
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
System.out.println("未连接到FTP,用户名或密码错误");
ftp.disconnect();
} else {
System.out.println("FTP连接成功");
}
} catch (SocketException e) {
e.printStackTrace();
System.out.println("FTP的IP地址可能错误,请正确配置");
} catch (IOException e) {
e.printStackTrace();
System.out.println("FTP的端口错误,请正确配置");
}
return ftp;
}
}
复制代码
测试结果
能输出引用地址就OK、但是事情没有这么好的结果、 以上结果是我配置好然后跑起来的效果
开始编写正常代码
前言
1、你得把ftp正常连接成功
出现错误请往下找解决原因、下面有我列出的几种原因
准备项目需要
POM依赖
<!-- 非常好用的java工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.2</version>
</dependency>
<!-- ftp连接的 -->
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.8.0</version>
</dependency>
复制代码
hutool
- 是一个java的封装好的工具类里面包含非常多的工具类、 网站:www.hutool.cn/
- 为什么要使用这个工具类因为没有必要在写一遍重复的代码、避免在网上选中工具类各种碰壁、在一个就是用起来简单
测试代码
public static void main(String[] args){
Ftp ftp = null;
try {
ftp = new Ftp("ip",ftp端口一般21,"用户名","密码");
System.out.println(ftp);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != ftp) {
try {
// 释放资源
ftp.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
复制代码
连接成功
常用方法
具体使用前往hutool
看文档: apidoc.gitee.com/dromara/hut…
cd() --改变目录
close() -- 释放资源
pwd() -- 获取当前目录
upload() -- 上传文件
download() -- 下载文件
delDir() -- 删除指定目录下的所有文件
delFile() -- 删除文件
ftp.getClient() -- 获取FTPClient对象
复制代码
上传文件
public static void main(String[] args){
Ftp ftp = null;
try {
// 账号和密码上面教你这么创建了
ftp = new Ftp("ip",21,"账号","密码");
// 这里去的地方是/home/账号名 组成的一个文件夹
// 登录的什么账号就是什么/home/xxx
System.out.println(ftp.pwd());
/*
上传文件方法
第一个参数:上传的路径
第二个参数:上传文件的名字
第三个参数:本地文件路径
*/
boolean upload = ftp.upload("./", "aaa.md", new File("E:\\笔记\\Linux\\Linux命令.md"));
System.out.println(upload);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != ftp) {
try {
ftp.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
复制代码
效果
上面代码中出现的./
是指当前目录、pwd()
可以获取当前目录的路径、cd()
进入到指定路径、
注意:上传到指定文件夹下的话改文件夹必须是当前登录ftpd的所有者、否者上传失败。
下载文件
public static void main(String[] args){
Ftp ftp = null;
try {
ftp = new Ftp("",21,"","");
System.out.println(ftp.pwd());
/**
上传文件方法
第一个参数:下载传的路径
第二个参数:下载传文件的名字
第三个参数:要存放本地文件路径
**/
ftp.download("./","aaa.md",new File("E:\\1"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != ftp) {
try {
ftp.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
复制代码
还可以通过ftp.getClient()
的这个方法来获取FTPClient
对象、来调用FTPClient
中的一些其他方法。
hutool
中主只不过是对FTPClient
的一个封装、其次这个只是上传某一个文件的的demo、不能上传指定文件夹、上传指定文件夹的方式也很简单、通过递调用来上传文件夹中的文件
注意:
- 我有时候会出现上传下载假死的在就是一直运行没有响应结果、下载的数据也是0KB、还请大佬指点指点
- 还有指定用户登录的情况下、文件上传的目录必须是这个用户的
所有者.所属组
、下载也是文件必须是这个登录的用户的所有者.所属组
。
SFTP
前期准备
1、导入需要的依赖
<!-- sftp 需要的 -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
<!-- hutool工具 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.2</version>
</dependency>
复制代码
2、编写代码
public static void main(String[] args) {
Sftp sftp = null;
try {
/**
SFTP 为 SSH的一部份、所以端口用的是22
**/
sftp = new Sftp("ip",22,"用户名","密码");
/**
第一个参数:上传的路径
第二个参数:上传的文件、文件名是什么上传的就是什么名字
**/
boolean upload = sftp.upload("/a", new File("E:\\1\\467.txt"));
System.out.println(upload);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sftp != null) {
sftp.close();
}
}
}
复制代码
下载
public static void main(String[] args) {
Sftp sftp = null;
try {
sftp = new Sftp("ip",22,"用户名","密码");
/**
第一个参数:下载的文件
第二个参数:下载的文件放什么地方
**/
sftp.download("/a/467.txt", new File("E:\\1\\123.txt"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sftp != null) {
sftp.close();
}
}
}
复制代码
说明一下:SFTP
是基于jsch
包上传的而hutool
只是一个工具类、也可以通过sftp.getClient()
获取jsch
对象来操作更多。
按道理22端口是不会出现端口被拦截的情况、因为默认访问SSH就是默认开放22端口的
FTP出现排查错误
排错
1、(阿里/腾讯)云的安全策略端口没开放
2、(阿里/腾讯)云的服务器防火墙开启了、未开放对应端口
上图是防火墙关闭的状态效果
上图为开启状态
ps:(阿里/腾讯)云的服务器某些是默认关闭防火墙
关于服务器防火墙的操作
拿出我的看家老本Liunx命令
关闭防火墙命令:systemctl stop firewalld.service
开启防火墙:systemctl start firewalld.service
重启防火墙:systemctl restart firewalld.service
关闭开机自启动:systemctl disable firewalld.service
开启开机启动:systemctl enable firewalld.service
查看防火墙状态:systemctl status firewalld
查看防火墙开放端口:iptables -L -n
centos7查看防火墙所有信息:firewall-cmd --list-all
centos7查看防火墙开放的端口信息:firewall-cmd --list-ports
复制代码
如果希望防火墙开启又允许端口访问的话就需要这样
添加开放端口
firewall-cmd --add-port=端口/tcp --zone=public --permanent
# 刷新使配置生效
firewall-cmd --reload
#说明:
#–zone #作用域
#–add-port=80/tcp #添加端口,格式为:端口/通讯协议
#–permanent 永久生效,没有此参数重启后失效
复制代码
删除开放端口
firewall-cmd --remove-port=端口/tcp --zone=public --permanent
# 刷新使配置生效
firewall-cmd --reload
复制代码
查看端口是否被允许
firewall-cmd --query-port=8080/tcp --zone=public
# 返回yes或no
复制代码
注意:这个仅次于服务器的防火墙端口开放、如果(阿里/腾讯)云的安全策略端口没开放也是不能获取连接的。
小结
基本就这些问题、如果你脑瘫在ftp中设置黑名单的话、当我没说。。
小结:
- 我看网上也有乱七八糟的
FTP
工具类、但是基本的上传文件、我们使用hutool
中的工具类就可以了、省的避免写重复的代码、他这个没有上传文件夹的的方法、上传整个文件夹的话可以采用递归的形式上传、后需自己封装。 - 遇到的一个问题就、在使用
FTP
上传/下载的时候、会导致一个假死的状态、就是一直运行没有结果、网上的方法也试了就是没用、之前我还能上传、就是有时候突然就会这样、有知道的还请指教指教!!!