SpringBoot内嵌ftp服务
引入依赖
<!-- 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地址
然后启动SpringBoot服务
工具连接
账号密码就是配置文件里面的密码
-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
(蓝奏云官网有些地址失效了,需要把请求地址lanzous改成lanzoux才可以)