SpringBoot接入ftp/ftps并上传文件和配置的代码指南

 更新时间:2024年12月20日 10:58:12   作者:天河归来  
接入ftp服务器,在springboot上实现起来也不算复杂,本文主要讲下如何在springboot下接入ftp服务上传文件,并对出现的问题做一些记录,ftp服务的参数配置等,需要的朋友可以参考下

1. 整体描述

接入ftp服务器,在springboot上实现起来也不算复杂,本文主要讲下如何在springboot下接入ftp服务上传文件,并对出现的问题做一些记录,ftp服务的参数配置等

2. 具体实现

2.1 引入pom

在springboot的配置文件引入:

        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.8.0</version>
        </dependency>

apache的包,其中有ftp相关的类

2.2 创建ftps连接

其中使用FTPClient创建的是FTP连接,FTPSClient创建的是FTPS连接,我这里创建了FTPS连接

    /**
     * 打开FTP连接
     *
     * @param hostname hostname
     * @param port     port
     * @param username username
     * @param password password
     */
    public static FTPSClient openFTP(String hostname, int port, String username, String password) {
        // 显示方式传false,隐式方式传true
        FTPSClient ftpsClient = new FTPSClient(true);
        ftpsClient.setControlEncoding("UTF-8");
        try {
            System.out.println("ftpsClient connect");
            ftpsClient.connect(hostname, port);
            boolean flag = ftpsClient.login(username, password);
            // 切换到被动模式
            ftpsClient.setControlEncoding("UTF-8");
            ftpsClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpsClient.enterLocalPassiveMode();
            ftpsClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
            ftpsClient.execPROT("P");
            ftpsClient.setAuthValue("TLS");

            if (!flag) {
                System.out.println("login failed");
                return null;
            }

            String path = ftpsClient.printWorkingDirectory();
            System.out.println("path:" + path);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return ftpsClient;
    }

2.3 上传文件

/**
     * 创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
     *
     * @param filePath   上传文件本地路径
     * @param ftpPath    上传文件FTP路径
     * @param ftpsClient ftp客户端
     */
    public static void uploadFileToFTP(String filePath, String ftpPath, FTPSClient ftpsClient) {
        try {
            File file = new File(filePath);

            boolean changeFlag = ftpsClient.changeWorkingDirectory(ftpPath);
            System.out.println("changeFlag:" + changeFlag);
            if (!changeFlag) {
                boolean createFlag = createDirectory(ftpPath, ftpsClient);
                System.out.println("createFlag:" + createFlag);
            }

            String uploadPath = ftpsClient.printWorkingDirectory();
            System.out.println("uploadPath:" + uploadPath);

            ftpsClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            boolean uploadFlag = ftpsClient.storeUniqueFile(file.getName(), new FileInputStream(file));

            System.out.println("uploadFlag:" + uploadFlag);
            System.out.println("uploadFlag:" + ftpsClient.getReplyString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2.4 关闭连接

    /**
     * 关闭FTP连接
     *
     * @param ftpsClient ftp客户端
     */
    public static void closeFTP(FTPSClient ftpsClient) {
        try {
            ftpsClient.logout();
            ftpsClient.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2.5 创建FTP目录

/**
     * 创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
     *
     * @param remote     目录
     * @param ftpsClient ftp客户端
     */
    public static boolean createDirectory(String remote, FTPSClient ftpsClient) {
        String directory = remote;
        try {
            if (!remote.endsWith("/")) {
                directory = directory + "/";
            }
            // 如果远程目录不存在,则递归创建远程服务器目录
            if (!directory.equals("/") && !ftpsClient.changeWorkingDirectory(directory)) {
                int start = 0;
                int end = 0;
                if (directory.startsWith("/")) {
                    start = 1;
                } else {
                    start = 0;
                }
                end = directory.indexOf("/", start);
                String paths = "", path = "";
                while (true) {
                    String subDirectory = remote.substring(start, end);
                    path = path + "/" + subDirectory;
                    // 目录不存在就创建
                    if (!ftpsClient.changeWorkingDirectory(subDirectory)) {
                        if (ftpsClient.makeDirectory(subDirectory)) {
                            ftpsClient.changeWorkingDirectory(subDirectory);
                        }
                    }
                    paths = paths + "/" + subDirectory;
                    start = end + 1;
                    end = directory.indexOf("/", start);
                    // 检查所有目录是否创建完毕
                    if (end <= start) {
                        break;
                    }
                }
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

2.6 main方法

public static void main(String[] args) {

        // 打开ftp连接
        FTPSClient ftpsClient = openFTP("192.168.1.100", 10012, "test1", "123456");
        if (null == ftpsClient) {
            return;
        }
        // 上传文件
        uploadFileToFTP("C:\\Users\\10187\\Desktop\\ftp.txt", "/TEST/PICTURE", ftpsClient);
        // 下载文件
        downloadFileFromFTP(ftpsClient);

        // 关闭ftp连接
        closeFTP(ftpsClient);
    }

2.7 运行结果

运行结果

log显示上传成功,去ftp对应目录也能看到上传的文件。

3. FTP服务器配置

服务器相关配置也需要修改一下,要不登录上传等会报错。FTP的配置文件一般在/etc/vsftpd下面,有个vsftpd.conf的文件

3.1 修改require_ssl_reuse参数

如果上传文件的时候报错:522 SSL connection failed; session reuse required: see require_ssl_reuse option in vsftpd.conf man page。
需要修改这个参数,默认是YES,需要改成NO

3.2 设置FTPS连接

第一步:创建私钥、证书

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd_ssl_key.pem -out /etc/vsftpd/vsftpd_ssl_cert.pem

第二步:添加以下配置到配置文件

ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/vsftpd_ssl_cert.pem
rsa_private_key_file=/etc/vsftpd/vsftpd_ssl_key.pem
require_ssl_reuse=NO

第三步:重启ftp服务

systemctl restart vsftpd

3.3 设置FTPS连接为隐式连接

FTPS支持显示连接和隐式连接两种,如果需要隐式连接,修改配置文件。添加如下配置:

implicit_ssl=YES

然后重启ftp服务即可。

4. 总结

以上就是配置和连接FTP/FTPS的基本操作,当然还有一些复杂的操作和配置,就自己探索吧。

到此这篇关于SpringBoot接入ftp/ftps并上传文件和配置的代码指南的文章就介绍到这了,更多相关SpringBoot接入ftp/ftps并上传和配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java基础学习笔记之泛型

    java基础学习笔记之泛型

    所谓泛型,就是变量类型的参数化。泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。
    2016-02-02
  • Window搭建部署RocketMQ步骤详解

    Window搭建部署RocketMQ步骤详解

    这篇文章主要介绍了Window搭建部署RocketMQ步骤详解,RocketMq是一个由阿里巴巴开源的消息中间件,脱胎去阿里每部使用的MetaQ,在设计上借鉴了Kafka。,需要的朋友可以参考下
    2019-06-06
  • Java中的可变参数常见用法实例总结

    Java中的可变参数常见用法实例总结

    这篇文章主要介绍了Java中的可变参数常见用法,结合实例形式总结分析了java可变参数的常见功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-10-10
  • Java统计一个字符串在另外一个字符串出现次数的方法

    Java统计一个字符串在另外一个字符串出现次数的方法

    这篇文章主要介绍了Java统计一个字符串在另外一个字符串出现次数的方法,涉及java字符串遍历、正则匹配等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • 已有的springcloud+mybatis项目升级为mybatis-plus的方法

    已有的springcloud+mybatis项目升级为mybatis-plus的方法

    这篇文章主要介绍了已有的springcloud+mybatis项目升级为mybatis-plus,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java SpringMvc中拦截器的应用

    java SpringMvc中拦截器的应用

    大家好,本篇文章主要讲的是java SpringMvc中拦截器的应用,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • java开发之File类详细使用方法介绍

    java开发之File类详细使用方法介绍

    这篇文章主要介绍了java开发之File类详细使用方法介绍,需要的朋友可以参考下
    2020-02-02
  • Java 8函数式接口之BinaryOperator使用示例详解

    Java 8函数式接口之BinaryOperator使用示例详解

    这篇文章主要大家介绍了Java 8函数式接口之BinaryOperator,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • SpringBoot如何获取Get请求参数详解

    SpringBoot如何获取Get请求参数详解

    SpringBoot为我们封装了许多简便的获取请求参数的方法,下面这篇文章主要给大家介绍了关于SpringBoot如何获取Get请求参数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • idea2020.1最新版永久破解/pycharm也可用(步骤详解)

    idea2020.1最新版永久破解/pycharm也可用(步骤详解)

    这篇文章主要介绍了idea2020.1最新版永久破解/pycharm也可用,本文给大家分享简单实现步骤,通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论