最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot快速搭建ftpserver服務(wù)端的詳細(xì)步驟

 更新時(shí)間:2023年11月03日 14:29:35   作者:湯姆貓不是貓  
基于springboot,使用ftpserver快速搭建一個(gè)FTP服務(wù)端,搭建過程很簡(jiǎn)單,我們把過程分成4個(gè)步驟,一分鐘內(nèi)快速完成構(gòu)建,感興趣的朋友跟隨小編一起看看吧

前言

基于springboot,使用ftpserver快速搭建一個(gè)FTP服務(wù)端。

搭建過程很簡(jiǎn)單,我們把過程分成4個(gè)步驟,一分鐘內(nèi)快速完成構(gòu)建。

實(shí)現(xiàn)功能

  • 使用ftpserver快速搭建一個(gè)FTP服務(wù)端
  • 支持多個(gè)用戶多個(gè)目錄上傳目錄
  • 支持FTP主動(dòng)模式(單個(gè)端口)和被動(dòng)模式(范圍隨機(jī)端口)
  • 監(jiān)聽ftpserver狀態(tài),方便進(jìn)行更細(xì)粒度權(quán)限控制等定制功能

依賴項(xiàng)

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項(xiàng)目中增加兩個(gè)配置,創(chuàng)建ftpserver.properties配置和在application.properties基礎(chǔ)上增加ftp配置。配置如下:

1、ftpserver.properties配置

#表示admin的密碼是12345,以下都是admin的參數(shù)設(shè)置,可以設(shè)置多個(gè)用戶
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基礎(chǔ)上增加以下配置

##FTP內(nèi)嵌服務(wù)器
#ftp連接端口
ftp.port=8021
# ftp主動(dòng)模式端口
ftp.activePort=8022
#ftp被動(dòng)模式數(shù)據(jù)傳輸端口
ftp.passivePorts=50021-60021

初始化FTP服務(wù)

該類繼承自ApplicationRunner類,會(huì)在springboot服務(wù)啟動(dòng)后自動(dòng)啟動(dòng)。
由于沒有考慮到springboot重啟的情況,所以ftp服務(wù)會(huì)出現(xiàn)無法釋放端口的問題,解決該問題請(qǐng)參考博主另一篇文章《springboot內(nèi)嵌ftpserver服務(wù)端在服務(wù)重啟后報(bào)錯(cuò)端口被占用解決辦法》,就可以解決跟隨springboot重啟ftp服務(wù)的問題。

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服務(wù)器
 * @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服務(wù)主動(dòng)模式和被動(dòng)模式參數(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配置,含主動(dòng)模式和被動(dòng)模式
 * @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();
        //這個(gè)只是控制端口,還有主動(dòng)模式端口和被動(dòng)模式下的某個(gè)范圍端口
        factory.setPort(ftpPort);
        factory.setIdleTimeout(10);
        //被動(dòng)模式
        DataConnectionConfigurationFactory dataConnectionConfigurationFactory = new DataConnectionConfigurationFactory();
        dataConnectionConfigurationFactory.setIdleTime(30);
        dataConnectionConfigurationFactory.setActiveLocalPort(ftpActivePort);//主動(dòng)模式端口
        dataConnectionConfigurationFactory.setPassiveIpCheck(true);
        dataConnectionConfigurationFactory.setPassivePorts(ftpPassivePorts);被動(dòng)模式使用的端口范圍
        factory.setDataConnectionConfiguration(dataConnectionConfigurationFactory.createDataConnectionConfiguration());
        // 替換默認(rèn)的監(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服務(wù)運(yùn)行狀態(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服務(wù)上傳和下載情況
 * @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);
    }
    /**
     * 關(guān)閉連接
     */
    @Override
    public FtpletResult onDisconnect(FtpSession session) throws FtpException,
            IOException {
        UUID sessionId = session.getSessionId();
        if(sessionId!=null) {
            log.info("{}關(guān)閉ftpserver連接", sessionId.toString());
        }
        User user = session.getUser();
        if(user!=null&&user.getName()!=null){
            log.info("{}用戶名:{}關(guān)閉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();
        //自動(dòng)創(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);
    }
}

以上步驟完成后,啟動(dòng)springboot。使用ftpclient工具嘗試連接配置文件里的8021控制端口,如以下圖所示,可以看到已經(jīng)連接成功。

到此這篇關(guān)于springboot快速搭建ftpserver服務(wù)端的文章就介紹到這了,更多相關(guān)springboot 搭建ftpserver服務(wù)端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java回顧之多線程同步的使用詳解

    基于Java回顧之多線程同步的使用詳解

    在這篇文章里,我們關(guān)注線程同步的話題。這是比多線程更復(fù)雜,稍不留意,我們就會(huì)“掉到坑里”,而且和單線程程序不同,多線程的錯(cuò)誤是否每次都出現(xiàn),也是不固定的,這給調(diào)試也帶來了很大的挑戰(zhàn)
    2013-05-05
  • 使用java項(xiàng)目搭建一個(gè)netty服務(wù)

    使用java項(xiàng)目搭建一個(gè)netty服務(wù)

    這篇文章主要為大家詳細(xì)介紹了如何使用java項(xiàng)目搭建一個(gè)netty服務(wù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • SpringBoot入門系列之JPA mysql

    SpringBoot入門系列之JPA mysql

    這篇文章主要介紹了SpringBoot入門系列之JPA mysql的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • SpringMVC ajax請(qǐng)求的處理方法介紹

    SpringMVC ajax請(qǐng)求的處理方法介紹

    Ajax即異步的 JavaScript和XML,是一種無需重新加載整個(gè)網(wǎng)頁(yè)的情況下,能夠更新部分模塊的網(wǎng)頁(yè)技術(shù),下面這篇文章主要給大家介紹了關(guān)于SpringMVC Ajax請(qǐng)求的處理,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • dubbo服務(wù)整合zipkin詳解

    dubbo服務(wù)整合zipkin詳解

    這篇文章主要介紹了dubbo服務(wù)整合zipkin,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringMVC @RequestMapping的使用演示和細(xì)節(jié)展示

    SpringMVC @RequestMapping的使用演示和細(xì)節(jié)展示

    本文詳細(xì)介紹了SpringMVC中@RequestMapping注解的用法,包括其映射請(qǐng)求、參數(shù)配置、Ant風(fēng)格URL、與@PathVariable結(jié)合使用,以及如何通過@Controller實(shí)現(xiàn)POJO作為控制器,強(qiáng)調(diào)掌握該注解對(duì)SpringMVC開發(fā)的重要性,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • java使用篩選法求n以內(nèi)的素?cái)?shù)示例(java求素?cái)?shù))

    java使用篩選法求n以內(nèi)的素?cái)?shù)示例(java求素?cái)?shù))

    這篇文章主要介紹了java使用篩選法求n以內(nèi)的素?cái)?shù)示例(java求素?cái)?shù)),需要的朋友可以參考下
    2014-04-04
  • java8 利用reduce實(shí)現(xiàn)將列表中的多個(gè)元素的屬性求和并返回操作

    java8 利用reduce實(shí)現(xiàn)將列表中的多個(gè)元素的屬性求和并返回操作

    這篇文章主要介紹了java8 利用reduce實(shí)現(xiàn)將列表中的多個(gè)元素的屬性求和并返回操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java使用POI-TL和JFreeChart動(dòng)態(tài)生成Word報(bào)告

    Java使用POI-TL和JFreeChart動(dòng)態(tài)生成Word報(bào)告

    本文介紹了使用POI-TL和JFreeChart生成包含動(dòng)態(tài)數(shù)據(jù)和圖表的Word報(bào)告的方法,并分享了實(shí)際開發(fā)中的踩坑經(jīng)驗(yàn),通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2025-02-02
  • Java分層開發(fā)必知之PO、BO、DTO、VO、POJO概念實(shí)例詳解

    Java分層開發(fā)必知之PO、BO、DTO、VO、POJO概念實(shí)例詳解

    Java編程模型是一種在軟件開發(fā)中幫助組織和管理代碼的框架,其中,VO,BO,PO,DO,以及DTO是一些關(guān)鍵概念,它們?cè)诓煌瑢哟魏碗A段起到重要作用,這篇文章主要介紹了Java分層開發(fā)必知之PO、BO、DTO、VO、POJO概念的相關(guān)資料,需要的朋友可以參考下
    2026-02-02

最新評(píng)論

石城县| 六安市| 乐山市| 石阡县| 历史| 丹东市| 石景山区| 文山县| 响水县| 扎赉特旗| 巴东县| 剑阁县| 太保市| 通榆县| 东乡族自治县| 定安县| 邵阳市| 江安县| 老河口市| 常熟市| 旬阳县| 嘉峪关市| 抚宁县| 曲阳县| 廉江市| 都昌县| 怀远县| 遂昌县| 岳池县| 平南县| 西乡县| 营口市| 汉川市| 南开区| 拉孜县| 公主岭市| 黄龙县| 余庆县| 宣武区| 广汉市| 抚远县|