Java使用FTPClient实现在ftp服务器中创建多级目录并上传文件(XTHS实测可行)
- 引入依赖
<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(); } } }
转自:Java使用FTPClient实现在ftp服务器中创建多级目录并上传文件 - 简书 (jianshu.com)