自己尝试在springboot2.0微服务中内嵌一个FTP Server

这篇具有很好参考价值的文章主要介绍了自己尝试在springboot2.0微服务中内嵌一个FTP Server。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.pom.xml添加依赖

        <dependency>
		    <groupId>org.apache.ftpserver</groupId>
		    <artifactId>ftpserver-core</artifactId>
		    <version>1.2.0</version>
		</dependency>

2.yml文件添加Ftp服务参数

自己尝试在springboot2.0微服务中内嵌一个FTP Server

 3.增加apache.ftpserver专用配置文件

自己尝试在springboot2.0微服务中内嵌一个FTP Server

文件内容(这里可以配置多个用户,这个是admin用户的配置。注意红色配置项是很多网上例子没有提及的)

自己尝试在springboot2.0微服务中内嵌一个FTP Server

 4.Java核心代码

以下三个Java类主体参考了网上别人的经验,但是其中有两个BUG,我做了改写,否则应用的时候存在问题。

自己尝试在springboot2.0微服务中内嵌一个FTP Server

 InitFtpServer:

package com.gg.lxz.ftp;

import org.apache.ftpserver.FtpServer;
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.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;

/**
 * 初始化FTP服务器
 * @author 87392
 *
 */
@Component
public class InitFtpServer implements ApplicationRunner, ApplicationListener<ContextClosedEvent> {
	
	private final static Logger logger = LoggerFactory.getLogger(InitFtpServer.class);

    @Autowired
	private FtpServer server;
	  
	@Override
	public void run(ApplicationArguments args) throws Exception {
		// TODO Auto-generated method stub
		try {
			server.start();
			logger.info("ftp server run...");
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void onApplicationEvent(ContextClosedEvent event) {
		// TODO Auto-generated method stub
		if(server.isStopped()){
			logger.info("ftp server is stopped");
		}
		logger.info("ftp server prepare to stop");
		server.stop();
		if(server.isStopped()){
			logger.info("ftp server is stopped");
		}else {
			logger.info("ftp server is not stopped");
		}
	}

}

 FtpServerListener:

package com.gg.lxz.ftp;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import org.apache.ftpserver.ftplet.DefaultFtplet;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.FtpRequest;
import org.apache.ftpserver.ftplet.FtpSession;
import org.apache.ftpserver.ftplet.FtpletResult;
import org.apache.ftpserver.ftplet.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 监听ftpserver服务上传和下载情况
 * @author 87392
 *
 */
public class FtpServerListener extends DefaultFtplet {

	private final static Logger logger = LoggerFactory.getLogger(FtpServerListener.class);
	
	/**
	 * 开始连接
	 */
	@Override
    public FtpletResult onConnect(FtpSession session) throws FtpException,
            IOException {
        UUID sessionId = session.getSessionId();
        if(sessionId!=null) {
        	logger.info("{}尝试登录ftpserver", sessionId.toString());
        }
        User user = session.getUser();
        if(user!=null&&user.getName()!=null){
        	logger.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) {
        	logger.info("{}关闭ftpserver连接", sessionId.toString());
        }
        User user = session.getUser();
        if(user!=null&&user.getName()!=null){
        	logger.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();
        //自动创建上传路径
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        //获取上传用户
        String name = session.getUser().getName();
        //获取上传文件名
        String filename = request.getArgument();
        logger.info("用户:'{}',上传文件到目录:'{}',文件名称为:'{}',状态:开始上传~", 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);
        }
        logger.info("用户:'{}',上传文件到目录:'{}',文件名称为:'{},状态:成功!'", 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);
    }

}

FtpServerConfig:

这里主要解决了两个问题

问题1:读取配置文件问题

自己尝试在springboot2.0微服务中内嵌一个FTP Server

 屏蔽的代码是原来网上的写法。这样只能在开发工具中成功执行。我重新改写成通过获取临时文件,转换userManagerFactory需要的File。

问题2:修改超时时间。

我在完成开发测试时,经常发现上送FTP文件,经常发着发着就断开了。然后发现是字段断开连接的超时时间太短。

自己尝试在springboot2.0微服务中内嵌一个FTP Server

  5.功能优化

因为ftpserver.properties直接打包程序到Jar包内,无法灵活修改FTP存放目录。于是做如下修改:

去掉ftpserver.properties中FTP目录存放

 文章来源地址https://www.toymoban.com/news/detail-488158.html

自己尝试在springboot2.0微服务中内嵌一个FTP Server

在yml文件增加配置

自己尝试在springboot2.0微服务中内嵌一个FTP Server 

修改 FtpServerConfig.java代码

自己尝试在springboot2.0微服务中内嵌一个FTP Server

自己尝试在springboot2.0微服务中内嵌一个FTP Server 

 完成后

自己尝试在springboot2.0微服务中内嵌一个FTP Server

 

 

到了这里,关于自己尝试在springboot2.0微服务中内嵌一个FTP Server的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里云服务器+宝塔 (尝试部署一个最简单的静态页面)

    进入网址:服务器购买地址 选择预装宝塔面板 购买完成后前往控制台 查看当前实例 设置或修改密码 设置用户名和密码 输入用户名和密码 连接成功页面如下: 请看客老爷移步到这个文章,传送门🙈 在命令行中输入: bt default 这里可以显示访问地址和密码,如图。 直接复

    2024年01月21日
    浏览(41)
  • 搭建一个属于自己的springboot项目

    最近公司要上个新系统,指定由我来带两个人进行开发,既然是新项目,那么项目搭建的事就落到我的头上了。现在都是使用springboot进行开发,为此我搭环境使用的是springboot,具体java环境如下, 使用springboot的版本是2.3.3.RELEASE。使用maven进行项目管理, 总结下,我使用到的

    2024年02月07日
    浏览(49)
  • 34、springboot切换内嵌Web服务器(Tomcat服务器)与 生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS

    知识点1:springboot切换内嵌Web服务器(Tomcat服务器) 知识点2:生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS spring-boot-starter-web 默认依赖 Tomcat 内置服务器 改为 Jetty 服务器 改为 Undertow 服务器 目的:把请求路径 http://xxxxx 改成 https://xxxxx 如图:原本普通的项目,启动后是http的

    2024年02月11日
    浏览(49)
  • 【SpringBoot2】SpringBoot开发实用篇

    ​ 什么是热部署?简单说就是你程序改了,现在要重新启动服务器,嫌麻烦?不用重启,服务器会自己悄悄的把更新后的程序给重新加载一遍,这就是热部署。 ​ 热部署的功能是如何实现的呢?这就要分两种情况来说了,非springboot工程和springboot工程的热部署实现方式完全

    2023年04月25日
    浏览(39)
  • 1、Springboot2简介

    在学习 SpringBoot 之前,建议先具备 SpringMVC(控制层)、Spring(业务层)和 Mybatis(持久层)的相关知识 Spring 框架虽然很出色,但是有一个明显的缺点:配置文件过于繁琐和复杂; 在单体项目中,因为配置文件只需要编写一遍即可,所以该缺点只是一个小问题; 在微服务项目

    2024年02月05日
    浏览(36)
  • 自己搭建一个KMS服务器

    本文仅适合个人用户,商业用户使用该程序可能会面临法律风险!!! 建议有经济能力的读者支持正版。 知周所众,Windows和Office不是免费软件。如果是新购买的品牌机,则应该预装有正版的Windows家庭版,部分用户还附赠Office。但是,我相信我的读者一大部分用的是自己组装

    2024年02月07日
    浏览(62)
  • SpringBoot2-核心技术(一)

    1. properties 同以前的用法 2. yaml YAML : “YAML Ain‘t Markup Language ”(yaml 不是一种递归标记语言) 的递归缩写, 在开发这种语言时,YAML 的意思是:Yet Another Markup Language (仍是一种标记语言) 非常适合用来做以数据为中心的配置文件 1. 基本语法 key: value ; value与: 之间存在空格

    2024年02月07日
    浏览(39)
  • 【SpringBoot】SpringBoot2.x知识点杂记

    本文仅供学习交流使用 为什么要使用 Spring Boot 因为Spring, SpringMVC 需要使用的大量的配置文件 (xml文件) 还需要配置各种对象,把使用的对象放入到spring容器中才能使用对象 需要了解其他框架配置规则。 SpringBoot 就相当于 不需要配置文件的Spring+SpringMVC。 常用的框架和第三

    2024年02月03日
    浏览(46)
  • SpringBoot2.0(Lombok,SpringBoot统一返回封装)

    ​ java工程中,我们要创建很多的java Bean。这些javaBean中都会写getter,setter,equals,hashCode和toString的模板代码,这些代码都没啥技术含量。 ​ 那么我们就是使用Lombok来自动生成这些代码,通过注解的方式。提高我们的工作效率。 ​ Lombok的原理:JSR 269插件化注解处理。就是在

    2024年02月09日
    浏览(36)
  • SpringBoot2.0集成WebSocket

    适用于单客户端,一个账号登陆一个客户端,登陆多个客户端会报错 The remote endpoint was in state [TEXT_FULL_WRITING]  这是因为此时的session是不同的,只能锁住一个session,解决此问题的方法把全局静态对象锁住,因为账号是唯一的 新建配置类 这个注解需要打上声明是开发环境,否

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包