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

1.pom.xml添加依赖

        
		    org.apache.ftpserver
		    ftpserver-core
		    1.2.0
		

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

自己尝试在springboot2.0微服务中内嵌一个FTP Server_第1张图片

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

自己尝试在springboot2.0微服务中内嵌一个FTP Server_第2张图片

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

自己尝试在springboot2.0微服务中内嵌一个FTP Server_第3张图片

 4.Java核心代码

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

 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 {
	
	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_第4张图片

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

问题2:修改超时时间。

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

 

你可能感兴趣的:(微服务,java,数学建模)