springboot接入ftp/ftps并上传文件和配置

embedded/2024/12/22 14:03:06/

springboot接入ftp/ftps并上传文件和配置

  • 1. 整体描述
  • 2. 具体实现
    • 2.1 引入pom
    • 2.2 创建ftps连接
    • 2.3 上传文件
    • 2.4 关闭连接
    • 2.5 创建FTP目录
    • 2.6 main方法
    • 2.7 运行结果
  • 3. FTP服务器配置
    • 3.1 修改require_ssl_reuse参数
    • 3.2 设置FTPS连接
    • 3.3 设置FTPS连接为隐式连接
  • 4. 总结

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连接

java">    /*** 打开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,隐式方式传trueFTPSClient 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 上传文件

java">/*** 创建多层目录文件,如果有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 关闭连接

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

2.5 创建FTP目录

java">/*** 创建多层目录文件,如果有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方法

java">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的基本操作,当然还有一些复杂的操作和配置,就自己探索吧。


http://www.ppmy.cn/embedded/147839.html

相关文章

Python解释器和PyCharm详解

目录 1.什么是Python解释器? Python解释器的类型和特性 Python解释器的优势 2.什么工具可以写Python文件? 3.为什么Python解释器和PyCharm不在同一个网站? 1.什么是Python解释器? Python解释器‌是Python程序运行的核心&#xff0c;它的主要作用是将Python代码转换为…

MQTT实现集群分布式消费

今天被问到启用多个应用消费时&#xff0c;每个消费者都会受到订阅消息的事。很久前用过&#xff0c;这里梳理记录一下&#xff1a; MQTT协议本身是支持共享订阅功能。 这里这个共享订阅比较特殊&#xff0c;他有点类似kafka的消费组的概念。但是设计和实现上区别比较大。 设…

扩展SpringBoot中的SpringMVC的默认配置

SpringBoot默认已经给我们做了很多SpringMVC的配置&#xff0c;哪些配置&#xff1f; 视图解析器ViewResolver静态资料的目录默认首页index.html图标名字和图标所在目录&#xff0c;favicon.ico类型转换器Converter&#xff0c;格式转换器的Formatter消息转换器HttpMessageCon…

java中随机数的生成

随机数的生成 方法一(使用Math.random方法)方法二(使用Random类) 方法一(使用Math.random方法) Math.random()方法就是专门生成一个0~1之间随机数的方法. 范围:[0,1). //生成[0,10)之间随机数.int num (int) (Math.random() * 10);System.out.println(num);方法二(使用Random…

【ETCD】【实操篇(二)】如何从源码编译并在window上搭建etcd集群?

要在 Windows 上编译 etcd 及 etcdctl 工具&#xff0c;并使用 bat 脚本启动 etcd 集群&#xff0c;首先需要准备好开发环境并确保依赖项正确安装。下面是从 etcd 3.5 源码开始编译和启动 etcd 集群的详细步骤&#xff1a; 目录 1. 安装 Go 环境2. 获取 etcd 源码3. 编译 etcd…

关于electron项目运行时,只编译渲染进程,不编译主进程问题

现象 编译到此处卡住没有报错也没下文 看下命令执行后操作 找到对应命令后操作 这里的await 没有收到完成信号导致 再看vue-cli-service 命令 此处发现是这个方法报错导致 再看这个方法 结论 所以项目不能存在 yarn.lock 而去使用npm&#xff0c;vuecli会优先执行yarn 命令&a…

Mac配置 Node镜像源的时候报错解决办法

在Mac电脑中配置国内镜像源的时候报错,提示权限问题,无法写入配置文件。本文提供解决方法,青测有效。 一、原因分析 遇到的错误是由于 .npm 目录下的文件被 root 用户所拥有,导致当前用户无法写入相关配置文件。 二、解决办法 在终端输入以下命令,输入管理员密码即可。 su…

C++9--前置++和后置++重载,const,日期类的实现(对前几篇知识点的应用)

目录 1.前置和后置重载 2.const成员 3.日期类的实现 1.前置和后置重载 #include<iostream> using namespace std;class Date { public:Date(int year 2024, int month 1, int day 1){_year year;_month month;_day day;}//前置&#xff1a;返回1之后的结果//注意…