SpringBoot下载FTP文件
大约 1 分钟
提示
公司需要通过ftp定时下载csv文件,读取最新内容; 所以写了这段代码
1. 引入FTP连接工具
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
2. FTP配置类
@ConfigurationProperties(prefix = "ftp")
@Component
@Data
public class FtpConfig {
private String host;
private int port;
private String ftpUser;
private String ftpPassword;
private String defaultPath = "/";
private String filePrefix = "test_";
private String fileSuffix = ".csv";
}
3. Configuration配置
@Configuration
@Slf4j
public class FtpConfiguration {
private FTPClient ftpClient;
@Autowired
private FtpConfig config;
@Bean
public FTPClient ftpClient() {
ftpClient = new FTPClient();
try {
ftpClient.connect(config.getHost(), config.getPort());
ftpClient.login(config.getFtpUser(), config.getFtpPassword());
ftpClient.setKeepAlive(true);
if (StringUtils.isNotBlank(config.getDefaultPath())) {
ftpClient.changeWorkingDirectory(config.getDefaultPath());
}
} catch (IOException e) {
log.error("connect to ftp client error!", e);
ftpClient = null;
throw new BeanCreationException("ftp client connect error");
}
return ftpClient;
}
@PreDestroy
public void shutDown() {
if (ftpClient == null) {
return;
}
if (ftpClient.isConnected()) {
try {
ftpClient.logout();
} catch (Exception e) {
log.error("ftp logout error!", e);
}
try {
ftpClient.disconnect();
} catch (Exception e) {
log.error("ftp logout error!", e);
}
}
}
}
4. 下载文件
@Slf4j
@Component
public class FTPService {
@Autowired
private FtpConfig ftpConfig;
@Autowired
private FTPClient ftpClient;
public void read() {
Date date = DateUtil.minus(new Date(), 2L, ChronoUnit.MINUTES);
String dateStr = DateUtil.format(date, DatePattern.yyyyMMddHHmm);
String filePath = ftpConfig.getFilePrefix() + dateStr + ftpConfig.getFileSuffix();
filePath = new String(filePath.getBytes(StandardCharsets.UTF_8), Charsets.ISO_8859_1);
log.info("start read ftp file:" + filePath);
try (InputStream is = ftpClient.retrieveFileStream(filePath)) {
List<String> lines = IOUtils.readLines(is, StandardCharsets.UTF_8.displayName());
} catch (IOException e) {
log.error("read ftp file error!", e);
} finally {
try {
ftpClient.getReply();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注:
1.在configuration类中配置
@PreDestroy
, 应用停止后, 自动断开ftp连接
2.在读取完ftp文件后, 需要调用ftpclient.getReply()
消费上次执行