- 引入依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.7</version>
</dependency>
- 要实现需求总共分为三步:
a. 建立连接;
b. 递归目录,并创建;
c. 上传;
根据这三步创建工具类
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.File;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
public class FtpUtil {
/**
* 建立连接
*
* @param ftp FTPClient对象
* @param addr IP地址
* @param port 端口号
* @param username 用户名
* @param password 密码
* @return 连接结果
* @throws Exception 异常
*/
public boolean connect(FTPClient ftp, String addr, int port, String username, String password) throws Exception {
int reply;
ftp.connect(addr, port);
ftp.login(username, password);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return false;
}
return true;
}
/**
* @param path ftp服务器文件目录
* @param ftp FTPClient对象
* @return 创建状态
*/
public boolean mkdirPath(String path, FTPClient ftp) {
try {
String directory = path.endsWith("/") ? path : path + "/";
if (!directory.equalsIgnoreCase("/") && !ftp.changeWorkingDirectory(new String(directory.getBytes("GBK"), StandardCharsets.ISO_8859_1))) {
// 如果远程目录不存在,则递归创建远程服务器目录
int start = 0;
int end;
if (directory.startsWith("/")) {
start = 1;
}
end = directory.indexOf("/", start);
do {
String subDirectory = new String(path.substring(0, end).getBytes("GBK"), StandardCharsets.ISO_8859_1);
if (!ftp.changeWorkingDirectory(subDirectory)) {
if (ftp.makeDirectory(subDirectory)) {
if (!ftp.changeWorkingDirectory(subDirectory)) {
return false;
}
} else {
return false;
}
}
start = end + 1;
end = directory.indexOf("/", start);
} while (end > start);
}
return true;
} catch (Exception exception) {
exception.printStackTrace();
return false;
}
}
/**
* @param file File文件对象
* @param ftp FTPClient对象
* @return 上传状态
* @throws Exception 异常
*/
public boolean upload(File file, FTPClient ftp) throws Exception {
if (file.isDirectory()) {
ftp.makeDirectory(file.getName());
ftp.changeWorkingDirectory(file.getName());
String[] files = file.list();
for (int i = 0; i < Objects.requireNonNull(files).length; i++) {
File file1 = new File(file.getPath() + "/" + files[i]);
if (file1.isDirectory()) {
upload(file1, ftp);
ftp.changeToParentDirectory();
} else {
File file2 = new File(file.getPath() + "/" + files[i]);
FileInputStream input = new FileInputStream(file2);
ftp.storeFile(file2.getName(), input);
input.close();
}
}
} else {
File file2 = new File(file.getPath());
FileInputStream input = new FileInputStream(file2);
ftp.storeFile(file2.getName(), input);
input.close();
}
ftp.disconnect();
return true;
}
}
- 使用测试
import com.spheign.szjx.util.FtpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import java.io.File;
@Slf4j
public class Test {
public static void main(String[] args) {
FtpUtil ftpUtil = new FtpUtil();
StringBuilder directory = new StringBuilder("~/assets/temp/install_package/");
FTPClient ftp = new FTPClient();
try {
boolean connect = ftpUtil.connect(ftp, "****ip", 21, "spheign", "****密码");
if(connect){
if (ftpUtil.mkdirPath(directory.toString(), ftp)) {
File folder = new File("/Users/spheign/demo/szjx/kms-bf.exe");
boolean uploadStatus = ftpUtil.upload(folder, ftp);
if(uploadStatus){
log.info("上传成功");
}else{
log.info("上传失败");
}
}
}else{
log.info("连接失败");
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
}