Java操作ftp文件工具类
首先,引入依赖,这里使用的是commons-net。
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
工具类中包含ftp服务器的文件上传、目录创建等操作。
import org.apache.commons.net.ftp.FTPClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
/**
* @ClassName FtpFileUtils
* @Description: TODO
* @Author zheng
* @Date 2020/10/10
* @Version V1.0
**/
public class FtpFileUtils {
private static Logger logger = LoggerFactory.getLogger(FtpFileUtils.class);
// 服务器IP地址
private static String ip = "填写IP地址";
// 用户名
private static String username = "填写ftp用户名";
// 密码
private static String password = "填写ftp密码";
// 端口号
private static int port = 000; // 修改ftp端口
// ftp客户端
private static FTPClient ftpClient;
/**
* 测试是否能连接
* @return 返回真则能连接
*/
public static boolean connect() {
boolean flag = false;
try {
ftpClient = new FTPClient();
//ftp初始化的一些参数
ftpClient.connect(ip, port);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.setControlEncoding("UTF-8");
if (ftpClient.login(username, password)) {
logger.info("连接ftp成功");
flag = true;
} else {
logger.error("连接ftp失败,可能用户名或密码错误!");
try {
disconnect(ftpClient);
} catch (Exception e) {
logger.error("ftp关闭失败!", e);
}
}
} catch (IOException e) {
logger.error("连接失败,可能ip或端口错误", e);
}
return flag;
}
/**
* 上传
*
* @param workingPath 服务器的工作目
* @param localFile 本地要上传的文件
* @param saveName 设置上传之后的文件名
* @return
*/
public static boolean upload(String workingPath, File localFile, String saveName) throws FileNotFoundException {
boolean flag = false;
InputStream fileInputStream = new FileInputStream(localFile);
//1 测试连接
if (connect()) {
try {
// Use passive mode to pass firewalls.
ftpClient.enterLocalPassiveMode();
//2 检查工作目录是否存在
if (ftpClient.changeWorkingDirectory(workingPath)) {
// 3 检查是否上传成功
if (storeFile(saveName, fileInputStream)) {
flag = true;
disconnect(ftpClient);
}
}
} catch (IOException e) {
logger.error("工作目录不存在", e);
disconnect(ftpClient);
}
}
return flag;
}
/**
* 上传文件
*
* @param saveName ftp上要保存的文件名
* @param fileInputStream 要上传的文件流
* @return
*/
public static boolean storeFile(String saveName, InputStream fileInputStream) {
boolean flag = false;
try {
if (ftpClient.storeFile(saveName, fileInputStream)) {
flag = true;
logger.info("{}文件上传成功", saveName);
disconnect(ftpClient);
}
} catch (IOException e) {
logger.error("{}文件上传失败", saveName, e);
disconnect(ftpClient);
}
return flag;
}
/**
* @MethodName: forceMkdir
* @Description: 创建文件夹
* @Param: [remotePath]
* @Return: boolean
* @Author: zheng
* @Date: 2019/12/10
**/
public static boolean forceMkdir(String remotePath) throws Exception {
boolean res = false;
if (connect()) {
res = ftpClient.makeDirectory(remotePath);
disconnect(ftpClient);
}
return res;
}
/**
* @MethodName: exists
* @Description: 判断路径是否存在
* @Param: [remotePath]
* @Return: boolean
* @Author: zheng
* @Date: 2019/12/10
**/
public static boolean exists(String remotePath) {
boolean isExists = true;
try {
if (connect()) {
isExists = ftpClient.changeWorkingDirectory(remotePath);
disconnect(ftpClient);
}
} catch (Exception e) {
isExists = false;
}
return isExists;
}
/**
* 断开连接
*
* @param ftpClient
* @throws Exception
*/
public static void disconnect(FTPClient ftpClient) {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
logger.info("已关闭连接");
} catch (IOException e) {
logger.error("没有关闭连接", e);
}
}
}
public static void main(String[] args) throws FileNotFoundException {
String workingPath = "/home/data/todatacenter/";
String str = "G:\\maven\\apache-maven-3.5.0\\lib\\wagon-http-2.12-shaded.jar";
String saveName = "wagon-http-2.12-shaded.jar";
System.out.println(upload(workingPath, new File(str), saveName));
}
}