Java操作FTP及SFTP上传/下载文件

版本

  • 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;
  }
}
复制代码

测试结果

1624540989239.png
能输出引用地址就OK、但是事情没有这么好的结果、 以上结果是我配置好然后跑起来的效果

开始编写正常代码

前言

1、你得把ftp正常连接成功
1624540989239.png
出现错误请往下找解决原因、下面有我列出的几种原因

准备项目需要

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();
      }
    }
  }
}
复制代码

连接成功

1624628260708.png

常用方法

具体使用前往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();
      }
    }
  }
}
复制代码

效果

1624634288908.png

1624633609059.png
上面代码中出现的./是指当前目录、pwd()可以获取当前目录的路径、cd()进入到指定路径、

注意:上传到指定文件夹下的话改文件夹必须是当前登录ftpd的所有者、否者上传失败。

1624634668274.png

下载文件

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();
    }
  }
}
复制代码

1624709939124.png

下载

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();
    }
  }
}
复制代码

1624709957080.png

说明一下:SFTP是基于jsch包上传的而hutool只是一个工具类、也可以通过sftp.getClient()获取jsch对象来操作更多。

按道理22端口是不会出现端口被拦截的情况、因为默认访问SSH就是默认开放22端口的

FTP出现排查错误

排错

1、(阿里/腾讯)云的安全策略端口没开放

1624541468840.png

2、(阿里/腾讯)云的服务器防火墙开启了、未开放对应端口

1624541537841.png

上图是防火墙关闭的状态效果

1624541705093.png

上图为开启状态

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上传/下载的时候、会导致一个假死的状态、就是一直运行没有结果、网上的方法也试了就是没用、之前我还能上传、就是有时候突然就会这样、有知道的还请指教指教!!!
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享