SpringBoot集成FTP文件服务器简单应用方式
作者:平平常常一般牛
这篇文章主要介绍了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设备的场景。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。