1.项目中导入Maven依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.9.0</version>
</dependency>
2.配置文件中进行配置
ftp:
basePath: /
host: 服务器地址
httpPath: ftp://服务器地址
password: 密码
port: 21(默认端口就是21)
username: 账号
3.创建配置类
@Data
@Component
@ConfigurationProperties(prefix = "ftp") // 这里对应上边的配置文件
public class FtpProperties {
/**
* ftp服务器的地址
*/
private String host;
/**
* ftp服务器的端口号(连接端口号)
*/
private String port;
/**
* ftp的用户名
*/
private String username;
/**
* ftp的密码
*/
private String password;
/**
* ftp上传的根目录
*/
private String basePath;
/**
* 回显地址
*/
private String httpPath;
}
4.ftp建立连接的方法(接口中使用)
@Slf4j
@Service
public class JsonImportServiceImpl implements JsonImportService {
@Autowired
FtpProperties ftpProperties;
// 其他接口方法
/*ftp建立连接方法*/
private FTPClient connectFtpServer(String filePath) {
// 创建FTPClient对象(对于连接ftp服务器,以及上传和上传都必须要用到一个对象)
FTPClient ftpClient = new FTPClient();
// 设置连接超时时间
ftpClient.setConnectTimeout(1000 * 60);
// 设置ftp字符集
ftpClient.setControlEncoding("utf-8");
try {
// 定义返回的状态码
int replyCode;
// 连接ftp(当前项目所部署的服务器和ftp服务器之间可以相互通讯,表示连接成功)
ftpClient.connect(ftpProperties.getHost(), Integer.parseInt(ftpProperties.getPort()));
// 输入账号和密码进行登录
ftpClient.login(ftpProperties.getUsername(), ftpProperties.getPassword());
// 设置被动模式,文件传输端口设置,否则文件上传不成功,也不报错
ftpClient.enterLocalPassiveMode();
// 接受状态码(如果成功,返回230,如果失败返回503)
replyCode = ftpClient.getReplyCode();
// 设置文件类型 这个类型可以获取压缩包,图片等相关文件,满足大部分场景
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.changeWorkingDirectory(filePath);
// 根据状态码检测ftp的连接,调用isPositiveCompletion(reply)-->如果连接成功返回true,否则返回false
if (!FTPReply.isPositiveCompletion(replyCode)) {
log.info("connect ftp {} failed", ftpProperties.getHost());
// 连接失败,断开连接
ftpClient.disconnect();
return null;
}
log.info("replyCode:" + replyCode);
} catch (IOException e) {
log.error("connect fail:" + e.toString());
return null;
}
return ftpClient;
}
}
5.常用的方法
//在调用ftp连接方法之后 获得一个FTPClient对象
FTPClient ftpClient;
FTPFile[] ftpDirectories = ftpClient.listDirectories(); //获取当前目录下的文件夹数组
FTPFile[] ftpFiles = ftpClient.listFiles(); //获取当前目录下的文件数组
InputStream inputStream = ftpClient.retrieveFileStream("绝对地址或者目录下的文件名称"); //获取所要获取文件的流对象
ftpClient.deleteFile("目录下的文件名称或者文件的绝对路径"); //删除文件
ftpClient.removeDirectory("目录下的目录名称或者目录的绝对路径"); //删除文件夹,删除文件夹的时候保证文件夹为空,否则删除失败
ftpClient.disconnect(); //断开连接 如果一直不断开连接,会导致超过最大连接数量
6.引用示例
如果在调用上边获取到流对象之后,刚好文件是一个压缩包,可以参考Java实现Json文件解析(附压缩包解压工具类)-CSDN博客