SpringBoot如何内嵌ftp服务呢?
下文笔者讲述SpringBoot中内嵌ftp服务的方法及示例分享,如下所示
1.引入相应的依赖 2.编写配置类 加入相应的配置信息例
引入依赖
<!-- https://mvnrepository.com/artifact/org.apache.ftpserver/ftpserver-core --> <dependency> <groupId>org.apache.ftpserver</groupId> <artifactId>ftpserver-core</artifactId> <version>1.1.1</version> </dependency>
Uploadlistener.java
import org.apache.ftpserver.ftplet.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; public class UploadListener extends DefaultFtplet { public static final Logger log= LoggerFactory.getLogger(UploadListener.class); /** * * 开始上传 * Override this method to intercept uploads * @param session The current {@link FtpSession} * @param request The current {@link FtpRequest} * @return The action for the container to take * @throws FtpException * @throws IOException */ @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(); log.info("用户:'{}',上传文件到目录:'{}',文件名称为:'{}',状态:开始上传~", name, path, filename); return super.onUploadEnd(session, request); } /** * 上传完成 * Override this method to handle uploads after completion * @param session The current {@link FtpSession} * @param request The current {@link FtpRequest} * @return The action for the container to take * @throws FtpException * @throws IOException */ @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("用户:'{}',上传文件到目录:'{}',文件名称为:'{},状态:成功!'", name, path, filename); return super.onUploadStart(session, request); } @Override public FtpletResult onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException { //todo servies... return super.onDownloadStart(session, request); } @Override public FtpletResult onDownloadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { //todo servies... return super.onDownloadEnd(session, request); } }
FtpConfig.java
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; /** * 配置类 */ @Configuration public class FtpConfig extends CachingConfigurerSupport { @Value("${ftp.port}") private Integer ftpPort; @Value("${ftp.passivePorts}") private String ftpPassivePorts; @Value("${ftp.passiveExternalAddress}") private String ftpPassiveExternalAddress; @Bean public FtpServer createFtpServer(){ FtpServerFactory serverFactory = new FtpServerFactory(); ListenerFactory factory = new ListenerFactory();/** * 被动模式 */ DataConnectionConfigurationFactory dataConnectionConfigurationFactory=new DataConnectionConfigurationFactory(); dataConnectionConfigurationFactory.setIdleTime(60); dataConnectionConfigurationFactory.setActiveLocalPort(ftpPort); dataConnectionConfigurationFactory.setPassiveIpCheck(true); dataConnectionConfigurationFactory.setPassivePorts(ftpPassivePorts); dataConnectionConfigurationFactory.setPassiveExternalAddress(ftpPassiveExternalAddress); factory.setDataConnectionConfiguration(dataConnectionConfigurationFactory.createDataConnectionConfiguration()); // replace the default listener serverFactory.addListener("default", factory.createListener()); PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); try { ClassPathResource classPathResource = new ClassPathResource("users.properties"); userManagerFactory.setUrl(classPathResource.getURL()); } catch (Exception e){ throw new RuntimeException("配置文件users.properties不存在"); } userManagerFactory.setPasswordEncryptor(new ClearTextPasswordEncryptor()); serverFactory.setUserManager(userManagerFactory.createUserManager()); Map<String, Ftplet> m = new HashMap<String, Ftplet>(); m.put("miaFtplet", new UploadListener()); serverFactory.setFtplets(m); // start the server FtpServer server = serverFactory.createServer(); return server; } }
InitFtpServer.java
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.commandlinerunner; import org.springframework.stereotype.Component; /** * springboot启动时初始化ftpserver */ @Component public class InitFtpServer implements CommandLineRunner { public static final Logger log = LoggerFactory.getLogger(FtpServer.class); @Autowired private FtpServer server; @Override public void run(String... args) throws Exception { try { server.start(); log.info(">>>>>>>ftp start success "); } catch (FtpException e) { e.printStackTrace(); log.error(">>>>>>>ftp start error {}", e); } } }
resource下创建users.properties
# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. #表示admin的密码是123456 以下都是admin的参数设置,可以多个 ftpserver.user.admin.userpassword=123456 ftpserver.user.admin.homedirectory=/home/data/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 yml配置文件加入 ftp: port: 21 #ftp连接端口 passivePorts: 20 #被动连接数据传输端口 passiveExternalAddress: 127.0.0.1 #部署的服务器ip地址启动Spring Boot,则一个简易的FTP服务及创建成功
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。