- 使用成熟的 Java FTP 服务器库(推荐):这是最常见、最简单的方法,你可以在现有的 Web 应用(如 Spring Boot)中嵌入一个 FTP 服务器库,它会在你的应用启动时启动,并在应用关闭时停止,这非常适合中小型项目、文件共享、测试环境等。
- 部署独立的 FTP 服务器软件:如 vsftpd (Linux), FileZilla Server (Windows), 或 ProFTPD,这种方法性能更高、更安全、功能更强大,适合生产环境,Java Web 应用在这种情况下扮演的是客户端的角色,用于连接和管理这个独立的 FTP 服务器。
下面我将详细介绍第一种方法,因为它更贴合“Java Web 服务器搭建”这个问题的核心,我也会简要介绍第二种方法。

在 Java Web 应用中嵌入 FTP 服务器 (推荐)
我们将使用一个非常流行的 Java FTP 服务器库:Apache Mina FTP Server,它稳定、功能丰富,并且易于集成。
步骤 1:创建一个 Spring Boot Web 项目
这是目前最主流的 Java Web 开发框架,我们使用 Spring Initializr (https://start.spring.io/) 来快速创建一个项目。
- Project: Maven Project
- Language: Java
- Spring Boot: 选择一个稳定版本 (如 2.7.x 或 3.x.x)
- Project Metadata:
- Group:
com.example - Artifact:
ftp-server-demo - Name:
ftp-server-demo - Description: Demo project for FTP Server
- Package name:
com.example.ftpserverdemo
- Group:
- Dependencies:
Spring WebSpring Boot DevTools(可选,用于热部署)
点击 "GENERATE" 下载项目并解压,然后用你喜欢的 IDE (如 IntelliJ IDEA 或 Eclipse) 打开。
步骤 2:添加 FTP 服务器依赖
打开 pom.xml 文件,添加 Apache Mina FTP Server 的依赖。

<dependencies>
<!-- ... 其他依赖 ... -->
<dependency>
<groupId>org.apache.ftpserver</groupId>
<artifactId>ftpserver-core</artifactId>
<version>1.2.0</version> <!-- 请使用最新稳定版本 -->
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
ftpserver-core是核心库。slf4j和logback是日志库,FTP 服务器运行时会产生日志,需要它们。
步骤 3:配置并启动 FTP 服务器
我们将创建一个 Spring Boot 配置类,用于在应用启动时初始化并启动 FTP 服务器。
-
创建一个配置类
FtpServerConfig在
src/main/java/com/example/ftpserverdemo目录下创建FtpServerConfig.java文件。package com.example.ftpserverdemo; import org.apache.ftpserver.FtpServer; import org.apache.ftpserver.FtpServerFactory; import org.apache.ftpftpserver.ftplet.FtpException; import org.apache.ftpserver.listener.ListenerFactory; import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; @Component public class FtpServerConfig { private FtpServer ftpServer; @EventListener(ApplicationReadyEvent.class) public void startFtpServer() throws FtpException { // 1. 创建 FtpServerFactory FtpServerFactory serverFactory = new FtpServerFactory(); // 2. 配置监听器 (IP 和端口) ListenerFactory listenerFactory = new ListenerFactory(); listenerFactory.setPort(2121); // 使用 2121 端口,避免与标准 FTP 21 冲突 // 如果需要绑定到特定IP // listenerFactory.setAddress("127.0.0.1"); serverFactory.addListener("default", listenerFactory.createListener()); // 3. 配置用户管理器 // 创建一个临时文件来存储用户信息 File userFile = null; try { userFile = File.createTempFile("ftp-users", ".properties"); // 确保文件在JVM退出时被删除 userFile.deleteOnExit(); } catch (IOException e) { throw new RuntimeException("Could not create temporary user file", e); } PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); userManagerFactory.setFile(userFile); // 设置匿名用户是否可登录 userManagerFactory.setAnonymousAuthenticationEnabled(false); // 添加一个测试用户 // 注意:实际项目中不要在代码中硬编码密码,应该从配置文件中读取 // userManagerFactory.getUserManager().save(new BaseUser("admin", "admin".toCharArray(), "/ftp/files")); serverFactory.setUserManager(userManagerFactory.createUserManager()); // 4. 配置文件系统 (设置FTP根目录) // 在项目根目录下创建一个 "ftp-files" 文件夹作为根目录 String homePath = System.getProperty("user.dir") + "/ftp-files"; File homeDir = new File(homePath); if (!homeDir.exists()) { homeDir.mkdirs(); } // 你也可以使用内存文件系统,但文件系统更实用 // serverFactory.setFileSystem(new VirtualFileSystem()); // 5. 创建并启动 FTP 服务器 this.ftpServer = serverFactory.createServer(); this.ftpServer.start(); System.out.println("FTP Server started on port 2121. Root directory: " + homePath); } // 添加一个优雅停机的方法 @EventListener(org.springframework.context.event.ContextClosedEvent.class) public void stopFtpServer() { if (this.ftpServer != null) { this.ftpServer.stop(); System.out.println("FTP Server stopped."); } } } -
创建一个简单的 Web Controller
(图片来源网络,侵删)为了验证 Web 应用能正常启动,我们创建一个简单的 Controller。
在
src/main/java/com/example/ftpserverdemo目录下创建HelloController.java文件。package com.example.ftpserverdemo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/") public String hello() { return "Welcome to the FTP Server Demo App!"; } }
步骤 4:运行和测试
-
运行应用:在 IDE 中运行
FtpServerDemoApplication.java(主启动类)。 -
查看控制台:你应该能看到 "FTP Server started on port 2121..." 的输出。
-
连接 FTP 服务器:
- 你需要一个 FTP 客户端,如 FileZilla、WinSCP 或命令行
ftp。 - 主机:
localhost(或0.0.1) - 端口:
2121 - 用户名:
admin - 密码:
admin - 协议: FTP (普通FTP,未加密)
如果连接成功,你将能够看到
/ftp-files目录下的文件,并且可以上传、下载文件。 - 你需要一个 FTP 客户端,如 FileZilla、WinSCP 或命令行
部署独立的 FTP 服务器 (Java Web 应用作为客户端)
这种方法更适合生产环境,因为它将服务与应用解耦,性能和安全性都更高。
选择并安装 FTP 服务器软件
- Linux (推荐): vsftpd (Very Secure FTP Daemon),通过包管理器安装即可,如
sudo apt-get install vsftpd(Ubuntu/Debian) 或sudo yum install vsftpd(CentOS/RHEL)。 - Windows: FileZilla Server,下载安装包,图形化界面,配置简单。
配置 FTP 服务器
- vsftpd 示例配置:
- 主要配置文件位于
/etc/vsftpd.conf。 - 关键配置项:
anonymous_enable=NO:禁止匿名登录。local_enable=YES:允许本地用户登录。write_enable=YES:允许写入操作(上传、创建目录等)。chroot_local_user=YES:将用户限制在其主目录下,提高安全性。pasv_min_port=40000和pasv_max_port=50000:配置被动模式的端口范围,避免防火墙问题。
- 创建一个专门用于FTP的用户,`ftpuser
- 主要配置文件位于
