在企业应用中,将文件推送到 FTP 服务器是一个常见的需求。本文将介绍如何在 Spring Boot 项目中实现将文件推送到 FTP 服务器,包括引入依赖、自定义配置和编写代码示例。
1. 引入依赖
首先,在 Spring Boot 项目的 pom.xml 文件中引入 Apache Commons Net 依赖,它是一个用于处理 FTP 操作的库:
bash
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.8.0</version>
</dependency>
2. 自定义 FTP 配置
创建一个配置类 FTPConfig,用于配置 FTP 连接的相关参数:
bash
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "ftp")
public class FTPConfig {
private String server;
private int port;
private String user;
private String password;
// Getters and Setters
public String getServer() {
return server;
}
public void setServer(String server) {
this.server = server;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在 application.yml 文件中添加 FTP 服务器的相关配置:
bash
ftp:
server: ftp.example.com
port: 21
user: ftpuser
password: ftppassword
3. 实现 FTP 服务类
创建一个服务类 FTPService,用于连接 FTP 服务器并上传文件:
bash
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
@Service
public class FTPService {
@Autowired
private FTPConfig ftpConfig;
public void uploadFile(String remotePath, MultipartFile file) throws IOException {
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(ftpConfig.getServer(), ftpConfig.getPort());
ftpClient.login(ftpConfig.getUser(), ftpConfig.getPassword());
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
try (InputStream inputStream = file.getInputStream()) {
boolean done = ftpClient.storeFile(remotePath, inputStream);
if (done) {
System.out.println("File " + file.getOriginalFilename() + " has been uploaded successfully.");
} else {
throw new IOException("Failed to upload file " + file.getOriginalFilename());
}
}
} finally {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
}
}
}
4. 编写控制器类
创建一个控制器类 FTPController,用于处理文件上传请求并调用 FTPService 进行文件上传:
bash
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
public class FTPController {
@Autowired
private FTPService ftpService;
@PostMapping("/uploadFile")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
String remotePath = "/uploads/" + file.getOriginalFilename();
ftpService.uploadFile(remotePath, file);
return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
} catch (IOException e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
完整代码结构
bash
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── ftp
│ │ ├── FTPApplication.java
│ │ ├── FTPConfig.java
│ │ ├── FTPService.java
│ │ └── FTPController.java
│ └── resources
│ └── application.yml
测试上传文件到 FTP 服务器
启动 Spring Boot 应用程序,使用 Postman 或类似工具发送 POST 请求至以下 URL,并上传要推送到 FTP 服务器的文件:
bash
POST http://localhost:8080/uploadFile
请求参数:
file: 上传的文件。
总结
通过本文,我们成功地在 Spring Boot 项目中实现了将文件推送到 FTP 服务器的功能。我们通过引入 Apache Commons Net 依赖、自定义 FTP 配置、创建 FTP 服务类和控制器类,实现了文件的上传和管理。这种方式可以帮助我们在各种应用场景中将文件高效地推送到 FTP 服务器,方便文件的存储和共享。