SpringBoot集成FTP文件服务器简单应用方式

 更新时间:2024年07月09日 16:47:54   作者:平平常常一般牛  
这篇文章主要介绍了SpringBoot集成FTP文件服务器简单应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

SpringBoot集成FTP实现创建FTP连接,文件上传功能;这里用到Apache commont-net;我这里搭建一个本地FTP服务器,这里我推荐我这篇文章:搭建本地测试FTP服务器,可以很轻松的搭建完成

环境

将Apache commont-net依赖放到pom.xml文件当中

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

简单示例

一个简单的参数配置文件

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * FTP参数配置文件
 *
 * @author chenlirun
 * @since 2024/3/25
 */
@Data
@Component
@ConfigurationProperties(prefix = "spring.ftp")
public class FtpProperties {

	/**
	 * 服务器地址
	 */
	private String host;

	/**
	 * 服务器端口
	 */
	private int port;

	/**
	 * 用户名
	 */
	private String userName;

	/**
	 * 密码
	 */
	private String password;

	/**
	 * 工作目录
	 */
	private String baseUrl;
}
spring:
  ftp:
    host: localhost
    port: 21
    user-name: root
    password: root
    base-url: /demoFile

提供的demo

提供的一个简单的创建FTP连接,文件上传,最后关闭连接释放资源。

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.springframework.beans.factory.annotation.Value;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

@Slf4j
public class FTPServer {

	@Value("${spring.ftp.host}")
	private String host;

	@Value("${spring.ftp.port}")
	private int port;

	@Value("${spring.ftp.username}")
	private String userName;

	@Value("${spring.ftp.password}")
	private String password;

	@Value("${spring.ftp.base-url}")
	private String baseUrl;


	@SneakyThrows
	public void uploadFile() {
		// FTP服务器初始化属性
		FTPClient ftpClient = new FTPClient();
		// 连接FTP服务器
		ftpClient.connect(host, port);
		if (!ftpClient.isConnected()) {
			log.error("FTP服务器连接失败");
		}
		// 登录FTP服务器
		boolean login = ftpClient.login(userName, password);
		if (!login) {
			ftpClient.logout();
			ftpClient.disconnect();
			log.error("FTP服务器登录失败");
		}
		// 设置FTP字符编码
		ftpClient.setControlEncoding("utf-8");
		//设置超时时间
		ftpClient.setDataTimeout(Duration.ofSeconds(3));
		//设置传输文件的类型,这里我设置成二进制,保证文件不丢包
		ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

		// 设置被动模式
		ftpClient.enterLocalPassiveMode();

		//切换FTP工作目录
		boolean isChangeWorkingDir = ftpClient.changeWorkingDirectory(baseUrl);
		if (!isChangeWorkingDir) {
			log.error("切换指定工作目录失败了!!!");
		}

		/**
		 * 上传文件到FTP服务器
		 */
		// 将字符串转成InputStream
		InputStream inputStream = IOUtils.toInputStream("aaaa", StandardCharsets.UTF_8);//
		String fileName = "demo.txt";
		//将InputStream流上传到FTP并保存成alarm.txt
		boolean b = ftpClient.storeFile(fileName, inputStream);
		if (!b) {
			log.error("文件上传FTP服务器失败!!!");
		}
		// 关闭流,释放资源
		inputStream.close();
		// 如果FTP处于连接状态,则关闭连接和登录
		if (ftpClient.isConnected()) {
			ftpClient.logout();
			ftpClient.disconnect();
		}
	}
}

FTPClient类方法简单介绍

FTPClient类是Apache Commons Net库中的一个类,用于实现FTP(文件传输协议)客户端的功能。

这个类提供了许多方法,用于与FTP服务器建立连接、上传文件、下载文件、列出目录内容、删除文件等。 

连接FTP服务器

  • connect(String hostname, int port): 使用指定的主机名和端口号连接到FTP服务器。
  • connect(String hostname): 使用默认端口(通常是21)连接到FTP服务器
  • login(String username, String password): 使用指定的用户名和密码登录到FTP服务器。

文件上传

  • storeFile(String remoteFileName, InputStream localFileStream):将本地文件流上传到FTP服务器,并指定远程文件名。
  • appendFileStream(String remote): 以追加模式将本地文件上传到FTP服务器。

文件下载

  • retrieveFile(String remoteFileName, OutputStream localFileStream):从FTP服务器下载文件,并将内容写入本地文件流。

目录操作

  • changeWorkingDirectory(String pathname): 更改FTP服务器上的当前工作目录。
  • listDirectories(): 列出当前工作目录下的所有目录。
  • listFiles(): 列出当前工作目录下的所有文件。

其他操作

  • disconnect(): 断开与FTP服务器的连接。
  • logout(): 注销FTP会话,通常在断开连接之前调用。
  • completePendingCommand(): 完成当前未完成的FTP命令的执行。
  • allocate(int bytes): 为文件传输分配字节数组大小。
  • 这只是一部分FTPClient类提供的方法。具体的方法建议查阅Apache Commons Net库的官方文档或相关资源。

主动模式和被动模式在FTP协议中的主要区别在于数据连接的建立方式:

主动模式(Active Mode):

  • 工作原理:客户端在本地打开一个非特权端口(通常大于1023),并通过这个端口发送PORT命令给服务器,告诉服务器客户端用于数据传输的端口号。然后,服务器使用其20端口(数据端口)主动连接到客户端指定的端口进行数据传输。
  • 安全性:由于服务器需要主动连接到客户端的端口,这可能引发一些安全问题,特别是当客户端位于防火墙或NAT设备后面时。
  • 适用场景:适用于客户端位于可以接受入站连接的网络环境,且没有防火墙或NAT设备限制的场景。

被动模式(Passive Mode):

  • 工作原理:客户端发送PASV命令给服务器,服务器在本地打开一个端口(通常是高位的非特权端口),并通过PASV命令的响应告诉客户端这个端口号。然后,客户端主动连接到服务器指定的这个端口进行数据传输。
  • 安全性:由于客户端主动连接到服务器,这种模式更适合于客户端位于防火墙或NAT设备后面的场景,因为这些设备通常允许出站连接但限制入站连接。
  • 适用场景: 特别适用于网络环境不稳定、存在防火墙或NAT设备的场景。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Web开发防止多用户重复登录的完美解决方案

    Java Web开发防止多用户重复登录的完美解决方案

    在web项目开发中,很多情况下都可以让同一个账号信息在不同的登录入口登录很多次,这样子做的不是很完善。一般解决这种情况有两种解决方案,小编呢主要以第二种方式给大家介绍具体的实现方法,对java web 防止多用户重复登录的解决方案感兴趣的朋友一起看看吧
    2016-11-11
  • springboot的yml配置文件通过db2的方式整合mysql的教程

    springboot的yml配置文件通过db2的方式整合mysql的教程

    这篇文章主要介绍了springboot的yml配置文件通过db2的方式整合mysql的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot集成Nacos的实战完全指南

    SpringBoot集成Nacos的实战完全指南

    Nacos 作为阿里巴巴开源的一站式微服务管理平台,已成为 Spring Cloud Alibaba 生态的核心组件,本文基于 Spring Boot 3.x + Nacos 2.x 最新版本,系统讲解 Nacos 的安装部署、配置中心、服务发现等核心功能,并提供生产级最佳实践方案,有需要的小伙伴可以了解下
    2026-02-02
  • Java多线程 中断机制及实例详解

    Java多线程 中断机制及实例详解

    这篇文章主要介绍了Java多线程 中断机制及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 关于aop切面 注解、参数如何获取

    关于aop切面 注解、参数如何获取

    这篇文章主要介绍了关于aop切面 注解、参数如何获取,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • IDEA集成Docker实现快捷部署的操作步骤

    IDEA集成Docker实现快捷部署的操作步骤

    这篇文章主要介绍了IDEA集成Docker实现快捷部署的操作步骤,通过灵活利用这一功能,开发人员可以更快速地开发、调试和部署应用程序,从而提高开发工作的效率和质量,需要的朋友可以参考下
    2024-06-06
  • Spring @ConditionalOnMissingBean 注解的主要作用解析

    Spring @ConditionalOnMissingBean 注解的主要作用解析

    @ConditionalOnMissingBean是Spring Boot中用于条件化配置的注解,确保只有在指定Bean不存在时才创建,它在自动配置中广泛应用,提供默认配置并允许用户自定义Bean,本文给大家介绍Spring @ConditionalOnMissingBean注解的作用,感兴趣的朋友一起看看吧
    2026-01-01
  • Java的位图和布隆过滤器深入详细讲解

    Java的位图和布隆过滤器深入详细讲解

    这篇文章主要介绍了Java的位图和布隆过滤器,在学习之前的数据结构的时候,我们使用的数据量都不是很大,但是在生活中,我们常常面临着要处理大量数据结果并得出最终结果,那么有没有什么数据结构可以帮助我们实现这样的功能呢,想要继续了解的朋友可以参考下
    2024-10-10
  • Java集合排序规则接口Comparator用法解析

    Java集合排序规则接口Comparator用法解析

    这篇文章主要介绍了Java集合排序规则接口Comparator用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • IDEA中的Run/Debug Configurations各项解读

    IDEA中的Run/Debug Configurations各项解读

    这篇文章主要介绍了IDEA中的Run/Debug Configurations各项解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论