springboot快速搭建ftpserver服務端的詳細步驟
前言
基于springboot,使用ftpserver快速搭建一個FTP服務端。
搭建過程很簡單,我們把過程分成4個步驟,一分鐘內(nèi)快速完成構建。
實現(xiàn)功能
- 使用ftpserver快速搭建一個FTP服務端
- 支持多個用戶多個目錄上傳目錄
- 支持FTP主動模式(單個端口)和被動模式(范圍隨機端口)
- 監(jiān)聽ftpserver狀態(tài),方便進行更細粒度權限控制等定制功能
依賴項
gradle方式:
implementation 'org.apache.ftpserver:ftpserver-core:1.2.0'
maven方式
<dependency> <groupId>org.apache.ftpserver</groupId> <artifactId>ftpserver-core</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>org.apache.ftpserver</groupId> <artifactId>ftpserver-core</artifactId> <version>1.2.0</version> </dependency>
配置文件
首先,在springboot項目中增加兩個配置,創(chuàng)建ftpserver.properties配置和在application.properties基礎上增加ftp配置。配置如下:
1、ftpserver.properties配置
#表示admin的密碼是12345,以下都是admin的參數(shù)設置,可以設置多個用戶 ftpserver.user.admin.userpassword=eguid ftpserver.user.admin.homedirectory=C://ftp ftpserver.user.admin.enableflag=true ftpserver.user.admin.writepermission=true ftpserver.user.admin.maxloginnumber=0 ftpserver.user.admin.maxloginperip=0 ftpserver.user.admin.idletime=0 ftpserver.user.admin.uploadrate=0 ftpserver.user.admin.downloadrate=0 #用戶名是eguid的用戶配置 ftpserver.user.eguid.userpassword=eguid ftpserver.user.eguid.homedirectory=C://ftp/eguid ftpserver.user.eguid.enableflag=true ftpserver.user.eguid.writepermission=true ftpserver.user.eguid.maxloginnumber=0 ftpserver.user.eguid.maxloginperip=0 ftpserver.user.eguid.idletime=0 ftpserver.user.eguid.uploadrate=0 ftpserver.user.eguid.downloadrate=0
2、application.properties配置
在原有application.properties基礎上增加以下配置
##FTP內(nèi)嵌服務器 #ftp連接端口 ftp.port=8021 # ftp主動模式端口 ftp.activePort=8022 #ftp被動模式數(shù)據(jù)傳輸端口 ftp.passivePorts=50021-60021
初始化FTP服務
該類繼承自ApplicationRunner類,會在springboot服務啟動后自動啟動。
由于沒有考慮到springboot重啟的情況,所以ftp服務會出現(xiàn)無法釋放端口的問題,解決該問題請參考博主另一篇文章《springboot內(nèi)嵌ftpserver服務端在服務重啟后報錯端口被占用解決辦法》,就可以解決跟隨springboot重啟ftp服務的問題。
import org.apache.ftpserver.FtpServer; import org.apache.ftpserver.ftplet.FtpException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; /** * 初始化ftp服務器 * @author 湯姆貓不是貓 */ @Component public class InitFtpServer implements ApplicationRunner { public static final Logger log = LoggerFactory.getLogger(InitFtpServer.class); @Autowired private FtpServer server; @Override public void run(ApplicationArguments args) throws Exception { try { server.start(); log.info("湯姆貓不是貓: ftp server start success "); } catch (FtpException e) { e.printStackTrace(); log.error("湯姆貓不是貓: ftp server start error {}", e); } } }
ftpserver服務主動模式和被動模式參數(shù)配置
import org.apache.ftpserver.DataConnectionConfigurationFactory; import org.apache.ftpserver.FtpServer; import org.apache.ftpserver.FtpServerFactory; import org.apache.ftpserver.ftplet.Ftplet; import org.apache.ftpserver.listener.ListenerFactory; import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor; import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import java.util.HashMap; import java.util.Map; /** * ftpserver配置,含主動模式和被動模式 * @author 湯姆貓不是貓 */ @Configuration public class FtpServerConfig extends CachingConfigurerSupport { @Value("${ftp.port}") private Integer ftpPort; @Value("${ftp.activePort}") private Integer ftpActivePort; @Value("${ftp.passivePorts}") private String ftpPassivePorts; @Bean public FtpServer createFtpServer() { FtpServerFactory serverFactory = new FtpServerFactory(); ListenerFactory factory = new ListenerFactory(); //這個只是控制端口,還有主動模式端口和被動模式下的某個范圍端口 factory.setPort(ftpPort); factory.setIdleTimeout(10); //被動模式 DataConnectionConfigurationFactory dataConnectionConfigurationFactory = new DataConnectionConfigurationFactory(); dataConnectionConfigurationFactory.setIdleTime(30); dataConnectionConfigurationFactory.setActiveLocalPort(ftpActivePort);//主動模式端口 dataConnectionConfigurationFactory.setPassiveIpCheck(true); dataConnectionConfigurationFactory.setPassivePorts(ftpPassivePorts);被動模式使用的端口范圍 factory.setDataConnectionConfiguration(dataConnectionConfigurationFactory.createDataConnectionConfiguration()); // 替換默認的監(jiān)聽器 serverFactory.addListener("default", factory.createListener()); PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); try { ClassPathResource classPathResource = new ClassPathResource("ftpserver.properties"); userManagerFactory.setUrl(classPathResource.getURL()); } catch (Exception e) { throw new RuntimeException("湯姆貓不是貓:配置文件ftpserver.properties不存在"); } userManagerFactory.setPasswordEncryptor(new ClearTextPasswordEncryptor()); serverFactory.setUserManager(userManagerFactory.createUserManager()); Map<String, Ftplet> m = new HashMap<String, Ftplet>(); m.put("miaFtplet", new FtpServerListener()); serverFactory.setFtplets(m); // 創(chuàng)建ftpserver FtpServer server = serverFactory.createServer(); return server; } }
監(jiān)聽ftp服務運行狀態(tài)
import org.apache.ftpserver.ftplet.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.UUID; /** * 監(jiān)聽ftpserver服務上傳和下載情況 * @author 湯姆貓不是貓 */ public class FtpServerListener extends DefaultFtplet { public static final Logger log = LoggerFactory.getLogger(FtpServerListener.class); /** * 開始連接 */ @Override public FtpletResult onConnect(FtpSession session) throws FtpException, IOException { UUID sessionId = session.getSessionId(); if(sessionId!=null) { log.info("{}嘗試登錄ftpserver", sessionId.toString()); } User user = session.getUser(); if(user!=null&&user.getName()!=null){ log.info("{}嘗試使用用戶名:{},密碼:{}登錄ftpserver.", sessionId.toString(), user.getName(), user.getPassword()); } return super.onConnect(session); } /** * 關閉連接 */ @Override public FtpletResult onDisconnect(FtpSession session) throws FtpException, IOException { UUID sessionId = session.getSessionId(); if(sessionId!=null) { log.info("{}關閉ftpserver連接", sessionId.toString()); } User user = session.getUser(); if(user!=null&&user.getName()!=null){ log.info("{}用戶名:{}關閉ftpserver連接.", sessionId.toString(), user.getName()); } return super.onDisconnect(session); } /** * 開始上傳 */ @Override public FtpletResult onUploadStart(FtpSession session, FtpRequest request) throws FtpException, IOException { //獲取上傳文件的上傳路徑 String path = session.getUser().getHomeDirectory(); //自動創(chuàng)建上傳路徑 File file = new File(path); if (!file.exists()) { file.mkdirs(); } //獲取上傳用戶 String name = session.getUser().getName(); //獲取上傳文件名 String filename = request.getArgument(); log.info("用戶:'{}',上傳文件到目錄:'{}',文件名稱為:'{}',狀態(tài):開始上傳~", name, path, filename); return super.onUploadEnd(session, request); } /** * 上傳完成 */ @Override public FtpletResult onUploadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { //獲取上傳文件的上傳路徑 String path = session.getUser().getHomeDirectory(); //獲取上傳用戶 String name = session.getUser().getName(); //獲取上傳文件名 String filename = request.getArgument(); File file = new File(path + "/" + filename); if (file.exists()) { System.out.println(file); } log.info("用戶:'{}',上傳文件到目錄:'{}',文件名稱為:'{},狀態(tài):成功!'", name, path, filename); return super.onUploadStart(session, request); } @Override public FtpletResult onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException { return super.onDownloadStart(session, request); } @Override public FtpletResult onDownloadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { return super.onDownloadEnd(session, request); } }
以上步驟完成后,啟動springboot。使用ftpclient工具嘗試連接配置文件里的8021控制端口,如以下圖所示,可以看到已經(jīng)連接成功。
到此這篇關于springboot快速搭建ftpserver服務端的文章就介紹到這了,更多相關springboot 搭建ftpserver服務端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決Springboot-application.properties中文亂碼問題
這篇文章主要介紹了解決Springboot-application.properties中文亂碼問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11idea將maven項目改成Spring boot項目的方法步驟
這篇文章主要介紹了idea將maven項目改成Spring boot項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱介紹
這篇文章主要介紹了Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10