FTP 下載有多種方式,一般都是基於 apache 的 FTPClient 的操作,當然JDK1.8之後也提供了支持。
這裏記錄一下 spring-integration-ftp (基於apache 的 FTPClient),
支持中文
支持併發
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-ftp</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
// 依賴注入
@Autowired
private FtpRemoteFileTemplate ftpRemoteFileTemplate;
@GetMapping("/test")
public ResponseEntity<String> test() {
String filePath = "/IB業務發展部/test_20180731_11.mp4";
// 判斷是否存在
boolean exists = ftpRemoteFileTemplate.exists(filePath);
// 下載文件
ftpRemoteFileTemplate.get(filePath, (inputStream -> {
try (FileOutputStream fos = new FileOutputStream("C:/Users/test/AppData/Local/Temp/download/" + filePath)) {
IOUtils.copy(inputStream, fos);
}
}));
return ResponseEntity.ok("啓動job成功");
}
# ftp 的配置文件(yaml格式)。
ftp:
host: 12.12.12.12
port: 8848
username: test
password: test
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.file.remote.session.SessionFactory;
import org.springframework.integration.ftp.session.DefaultFtpSessionFactory;
import org.springframework.integration.ftp.session.FtpRemoteFileTemplate;
/**
* @author Fuyuanwu
* @date 2019/7/31 10:01
*/
@Configuration
public class FTPConfig {
@Bean("ftpSessionFactory")
public SessionFactory<FTPFile> ftpSessionFactory(FtpSessionFactoryConfig config) {
DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory() {
/**
* 高併發下和ftp服務器握手會返回response 421 received.錯誤。因此採用同步。
* @return
*/
@Override
public synchronized FtpSession getSession() {
return super.getSession();
}
};
sf.setHost(config.getHost());
sf.setPort(config.getPort());
sf.setUsername(config.getUsername());
sf.setPassword(config.getPassword());
sf.setControlEncoding("UTF-8");
sf.setFileType(FTP.BINARY_FILE_TYPE);
sf.setClientMode(FTPClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE);
CachingSessionFactory<FTPFile> csf = new CachingSessionFactory<>(sf);
csf.setPoolSize(config.getPoolSize());
return csf;
}
@Bean
@ConfigurationProperties(prefix = "ftp")
public FtpSessionFactoryConfig ftpSessionFactoryProperties() {
return new FtpSessionFactoryConfig();
}
@Bean
public FtpRemoteFileTemplate ftpRemoteFileTemplate(@Qualifier("ftpSessionFactory") SessionFactory<FTPFile> sessionFactory) {
FtpRemoteFileTemplate ftpRemoteFileTemplate = new FtpRemoteFileTemplate(sessionFactory);
ftpRemoteFileTemplate.setExistsMode(FtpRemoteFileTemplate.ExistsMode.NLST);
return ftpRemoteFileTemplate;
}
class FtpSessionFactoryConfig {
private String host;
private int port;
private String username;
private String password;
private int poolSize = 5;
private int dataTimeout = 1000 * 60 * 10;
public int getDataTimeout() {
return dataTimeout;
}
public void setDataTimeout(int dataTimeout) {
this.dataTimeout = dataTimeout;
}
public int getPoolSize() {
return poolSize;
}
public void setPoolSize(int poolSize) {
this.poolSize = poolSize;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
}