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文件,经常发着发着就断开了。然后发现是字段断开连接的超时时间太短。

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信