1.pom.xml添加依赖
<dependency>
<groupId>org.apache.ftpserver</groupId>
<artifactId>ftpserver-core</artifactId>
<version>1.2.0</version>
</dependency>
2.yml文件添加Ftp服务参数
3.增加apache.ftpserver专用配置文件
文件内容(这里可以配置多个用户,这个是admin用户的配置。注意红色配置项是很多网上例子没有提及的)
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<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:读取配置文件问题
屏蔽的代码是原来网上的写法。这样只能在开发工具中成功执行。我重新改写成通过获取临时文件,转换userManagerFactory需要的File。
问题2:修改超时时间。
我在完成开发测试时,经常发现上送FTP文件,经常发着发着就断开了。然后发现是字段断开连接的超时时间太短。
5.功能优化
因为ftpserver.properties直接打包程序到Jar包内,无法灵活修改FTP存放目录。于是做如下修改:
去掉ftpserver.properties中FTP目录存放
文章来源地址https://www.toymoban.com/news/detail-488158.html
在yml文件增加配置
修改 FtpServerConfig.java代码
完成后
文章来源:https://www.toymoban.com/news/detail-488158.html
到了这里,关于自己尝试在springboot2.0微服务中内嵌一个FTP Server的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!